匹配 3 个或更多连续连续字符和连续相同字符的正则表达式
Posted
技术标签:
【中文标题】匹配 3 个或更多连续连续字符和连续相同字符的正则表达式【英文标题】:Regular Expression to match 3 or more Consecutive Sequential Characters and Consecutive Identical Characters 【发布时间】:2012-02-11 09:34:17 【问题描述】:我需要正则表达式来匹配以下情况。
-
3 个或更多连续的连续字符/数字;例如123、abc、789、pqr 等
3 个或更多连续相同的字符/数字;例如111、aaa、bbb、222等。
【问题讨论】:
如果你想要一个在字符串不包含 3 个连续相同字符的情况下通过的正则表达式,你可以使用这个:/^(?!.*(.)\1\1.*).*$/
- regex101.com/r/hxTDfr/2
【参考方案1】:
匹配三个连续数字或字母的正则表达式是
"([0-9]|[aA-zZ])\1\1
"
【讨论】:
【参考方案2】:第一个问题试试这个。
如果在 arg 中找到 3 个连续的数字或字母,则返回 true
function check(val)
for (i = 0; i <= val.length - 3; i++)
var s1 = val.charCodeAt(i);
var s2 = val.charCodeAt(i + 1);
var s3 = val.charCodeAt(i + 2);
if (Math.abs(s1 - s2) === 1 && s1 - s2 === s2 - s3)
return true;
return false;
console.log(check('Sh1ak@ki1r@100'));
【讨论】:
【参考方案3】:我正在与一位同事讨论这个问题,我们认为我们对 #1 有一个很好的解决方案。
检查 abc 或 bcd 或 ... 或 012 或 123 甚至任何数量的连续字符,试试:
.*((a(?=b))|(?:b(?=c))|(?:c(?=d))|(?:d(?=e))|(?:e(?=f))|(?:f(?=g))|(?:g(?=h))|(?:h(?=i))|(?:i(?=j))|(?:j(?=k))|(?:k(?=l))|(?:l(?=m))|(?:m(?=n))|(?:n(?=o))|(?:o(?=p))|(?:p(?=q))|(?:q(?=r))|(?:r(?=s))|(?:s(?=t))|(?:t(?=u))|(?:u(?=v))|(?:v(?=w))|(?:w(?=x))|(?:x(?=y))|(?:y(?=z))|(?:0(?=1))|(?:1(?=2))|(?:2(?=3))|(?:3(?=4))|(?:4(?=5))|(?:5(?=6))|(?:6(?=7))|(?:7(?=8))|(?:8(?=9)))2,.*
这个解决方案的好处是,如果您想要超过 3 个连续字符,请将 2,
增加到比您要检查的字符少 1 个。
每个组中的?:
防止该组被捕获。
【讨论】:
【参考方案4】:对于案例#2,我从regextester 上的示例中得到启发,并创建了以下正则表达式来匹配n
相同的数字(要检查数字和字母,请将0-9
替换为A-Za-z0-9
):
const n = 3
const identicalAlphanumericRegEx = new RegExp("([0-9])" + "\\1".repeat(n - 1))
【讨论】:
【参考方案5】:全部放在一起:
([a-zA-Z0-9])\1\1+|(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq |pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|012|123|234|345|456|567|678|789)+
3 个或更多连续的连续字符/数字;例如123、abc、789、pqr等
(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy| xyz|012|123|234|345|456|567|678|789)+
3 个或更多连续相同的字符/数字;例如111、aaa、bbb、222等
([a-zA-Z0-9])\1\1+
https://regexr.com/4727n
这也有效:
(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6) |6(?=7)|7(?=8)|8(?=9))2,\d|(?:a(?=b)|b(?=c)|c(?= d)|d(?=e)|e(?=f)|f(?=g)|g(?=h)|h(?=i)|i(?=j)|j(?=k )|k(?=l)|l(?=m)|m(?=n)|n(?=o)|o(?=p)|p(?=q)|q(?=r) |r(?=s)|s(?=t)|t(?=u)|u(?=v)|v(?=w)|w(?=x)|x(?=y)| y(?=z))2,[[:alpha:]])|([a-zA-Z0-9])\1\1+
https://regex101.com/r/6fXC9u/1
【讨论】:
【参考方案6】:全部放在一起:
([a-zA-Z0-9])\1\1+|(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq |pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|012|123|234|345|456|567|678|789)+
3 个或更多连续的连续字符/数字;例如123、abc、789、pqr等
(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy| xyz|012|123|234|345|456|567|678|789)+
3 个或更多连续相同的字符/数字;例如111、aaa、bbb、222等
([a-zA-Z0-9])\1\1+
https://regexr.com/4727n
【讨论】:
【参考方案7】:3 个或更多连续的连续字符/数字;例如123、abc、789、pqr等
(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9))2,\d|(?:a(?=b)|b(?=c)|c(?=d)|d(?=e)|e(?=f)|f(?=g)|g(?=h)|h(?=i)|i(?=j)|j(?=k)|k(?=l)|l(?=m)|m(?=n)|n(?=o)|o(?=p)|p(?=q)|q(?=r)|r(?=s)|s(?=t)|t(?=u)|u(?=v)|v(?=w)|w(?=x)|x(?=y)|y(?=z))2,[\pAlpha])
https://regex101.com/r/5IragF/1
3 个或更多连续相同的字符/数字;例如111、aaa、bbb、222等
([\pAlnum])\12,
https://regex101.com/r/VEHoI9/1
【讨论】:
【参考方案8】:对于第一个问题,如果您可以使用较少的正则表达式,则此方法有效
containsConsecutiveCharacters(str)
for (let i = 0; i <= str.length - 3; i++)
var allthree = str[i] + str[i + 1] + str[i + 2];
let s1 = str.charCodeAt(i);
let s2 = str.charCodeAt(i + 1);
let s3 = str.charCodeAt(i + 2);
if (
/[a-zA-Z]+$/.test(allthree) &&
(s1 < s2 && s2 < s3 && s1+s2+s3-(3*s1) === 3)
)
return true;
【讨论】:
这里有正则表达式, 是的,我在某个时候编辑了答案。不过,我没有得到反对票,这非常有效。这可能并不理想,但我认为这不是一个错误的答案,而且代码很容易解释。【参考方案9】:我不同意,案例 1 可以用正则表达式,但你必须告诉它要匹配的序列......这有点长而且无聊:
/(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|012|123|234|345|456|567|678|789)+/ig
http://regexr.com/3dqln
【讨论】:
【参考方案10】:我认为您不能在第一种情况下使用正则表达式。第二种情况很简单:
Pattern pattern = Pattern.compile("([a-z\\d])\\1\\1", Pattern.CASE_INSENSITIVE);
由于\\1
表示与1
组匹配的部分,这将匹配a-z
范围内或数字(\d
) 内的三个相同字符的任何序列。
【讨论】:
***.com/questions/22931991/… 指出,确实可以匹配字符串中任意长度的连续字符,前提是您定义了字符遵循的规则。【参考方案11】:感谢大家帮助我。
对于第一种情况 - 3 个或更多连续的连续字符/数字;例如123、abc、789、pqr等我用了下面的代码逻辑。请在此分享您的 cmets。
public static boolean validateConsecutiveSeq(String epin)
char epinCharArray[] = epin.toCharArray();
int asciiCode = 0;
boolean isConSeq = false;
int previousAsciiCode = 0;
int numSeqcount = 0;
for (int i = 0; i < epinCharArray.length; i++)
asciiCode = epinCharArray[i];
if ((previousAsciiCode + 1) == asciiCode)
numSeqcount++;
if (numSeqcount >= 2)
isConSeq = true;
break;
else
numSeqcount = 0;
previousAsciiCode = asciiCode;
return isConSeq;
【讨论】:
艺术就是少写代码。在这种情况下,您需要找到正确的正则表达式。【参考方案12】:如果你有下限(3)和上限regexString,可以如下生成
public class RegexBuilder
public static void main(String[] args)
StringBuilder sb = new StringBuilder();
int seqStart = 3;
int seqEnd = 5;
buildRegex(sb, seqStart, seqEnd);
System.out.println(sb);
private static void buildRegex(StringBuilder sb, int seqStart, int seqEnd)
for (int i = seqStart; i <= seqEnd; i++)
buildRegexCharGroup(sb, i, '0', '9');
buildRegexCharGroup(sb, i, 'A', 'Z');
buildRegexCharGroup(sb, i, 'a', 'z');
buildRegexRepeatedString(sb, i);
private static void buildRegexCharGroup(StringBuilder sb, int seqLength,
char start, char end)
for (char c = start; c <= end - seqLength + 1; c++)
char ch = c;
if (sb.length() > 0)
sb.append('|');
for (int i = 0; i < seqLength; i++)
sb.append(ch++);
private static void buildRegexRepeatedString(StringBuilder sb, int seqLength)
sb.append('|');
sb.append("([a-zA-Z\\d])");
for (int i = 1; i < seqLength; i++)
sb.append("\\1");
输出
012|123|234|345|456|567|678|789|ABC|BCD|CDE|DEF|EFG|FGH|GHI|HIJ|IJK|JKL|KLM|LMN|MNO|NOP|OPQ|PQR|QRS|RST|STU|TUV|UVW|VWX|WXY|XYZ|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|([a-z\d])\1\1|0123|1234|2345|3456|4567|5678|6789|ABCD|BCDE|CDEF|DEFG|EFGH|FGHI|GHIJ|HIJK|IJKL|JKLM|KLMN|LMNO|MNOP|NOPQ|OPQR|PQRS|QRST|RSTU|STUV|TUVW|UVWX|VWXY|WXYZ|abcd|bcde|cdef|defg|efgh|fghi|ghij|hijk|ijkl|jklm|klmn|lmno|mnop|nopq|opqr|pqrs|qrst|rstu|stuv|tuvw|uvwx|vwxy|wxyz|([a-z\d])\1\1\1|01234|12345|23456|34567|45678|56789|ABCDE|BCDEF|CDEFG|DEFGH|EFGHI|FGHIJ|GHIJK|HIJKL|IJKLM|JKLMN|KLMNO|LMNOP|MNOPQ|NOPQR|OPQRS|PQRST|QRSTU|RSTUV|STUVW|TUVWX|UVWXY|VWXYZ|abcde|bcdef|cdefg|defgh|efghi|fghij|ghijk|hijkl|ijklm|jklmn|klmno|lmnop|mnopq|nopqr|opqrs|pqrst|qrstu|rstuv|stuvw|tuvwx|uvwxy|vwxyz|([a-z\d])\1\1\1\1
【讨论】:
【参考方案13】:3 个或更多连续的连续字符/数字 ex - 123、abc、789、pqr 等。
不能使用正则表达式。
3 个或更多连续相同的字符/数字,例如 - 111、aaa、bbb。 222等
使用pattern 中的(?i)(?:([a-z0-9])\\12,)*
。
如果要检查整个字符串,请使用Matcher.matches()
。要在字符串中查找匹配项,请使用 Matcher.find()
。
这里有一些示例代码:
final String ps = "(?i)(?:([a-z0-9])\\12,)*";
final String psLong =
"(?i)\t\t\t# Case insensitive flag\n"
+ "(?:\t\t\t\t# Begin non-capturing group\n"
+ " (\t\t\t\t# Begin capturing group\n"
+ " [a-z0-9]\t\t# Match an alpha or digit character\n"
+ " )\t\t\t\t# End capturing group\n"
+ " \\1\t\t\t\t# Back-reference first capturing group\n"
+ " 2,\t\t\t# Match previous atom 2 or more times\n"
+ ")\t\t\t\t# End non-capturing group\n"
+ "*\t\t\t\t# Match previous atom zero or more characters\n";
System.out.println("***** PATTERN *****\n" + ps + "\n" + psLong
+ "\n");
final Pattern p = Pattern.compile(ps);
for (final String s : new String[] "aa", "11", "aaa", "111",
"aaaaaaaaa", "111111111", "aaa111bbb222ccc333",
"aaaaaa111111bbb222")
final Matcher m = p.matcher(s);
if (m.matches())
System.out.println("Success: " + s);
else
System.out.println("Fail: " + s);
输出是:
***** PATTERN *****
(?i)(?:([a-z0-9])\12,)*
(?i) # Case insensitive flag
(?: # Begin non-capturing group
( # Begin capturing group
[a-z0-9] # Match an alpha or digit character
) # End capturing group
\1 # Back-reference first capturing group
2, # Match previous atom 2 or more times
) # End non-capturing group
* # Match previous atom zero or more characters
Fail: aa
Fail: 11
Success: aaa
Success: 111
Success: aaaaaaaaa
Success: 111111111
Success: aaa111bbb222ccc333
Success: aaaaaa111111bbb222
【讨论】:
您的第一个模式将匹配非连续字符(即vbgt
)
糟糕,把它留在里面了。更正了。
如何检查字符串是否有一组 3 个或更多连续的相似字符(.....CCC....),字符串不应该有 3 个连续的相似字符。例如。它不应该接受 1. AAA 2. AAAAAAA 3. AAAAR【参考方案14】:
据我所知,第一种情况确实是不可能的。正则表达式引擎对自然数或字母的顺序一无所知。但至少可以区分 3 个或更多数字和 3 个或更多字母,例如:
[a-z]3,|[A-Z]3,|\d3,
例如,这匹配 abcd
、ABCDE
或 123
,但不匹配 ab2d
、A5c4
或 12z
。据此,第二种情况可以在较短的版本中正确给出:
(\w)\12,
【讨论】:
\w
还包括下划线_
可以,但是作者没有明确排除标点符号。她只提到了相同的字符。这几乎可以是一切。但无论如何...【参考方案15】:
第二个问题:
\\b([a-zA-Z0-9])\\1\\1+\\b
解释:
\\b : zero-length word boundary
( : start capture group 1
[a-zA-Z0-9] : a letter or a digit
) : end group
\\1 : same character as group 1
\\1+ : same character as group 1 one or more times
\\b : zero-length word boundary
【讨论】:
虽然第一部分不是连续的。 你为什么使用边界这个词?我没有看到说明我们正在寻找自动换行搜索的问题 @MiladNaseri 避免匹配aaaaaaab
。
如何将其转换为小于 3?
@Saksham:只需删除最后一个\\1+
。以上是关于匹配 3 个或更多连续连续字符和连续相同字符的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章