正则表达式匹配3个或更多连续顺序字符和连续相同字符

我需要正则表达式来匹配以下情况。

  1. 3个或更多连续的连续字符/数字; 例如123,abc,789,pqr等
  2. 3个或更多连续相同的字符/数字; 例如111,aaa,bbb,222等

我认为你不能在第一种情况下使用正则表达式。 第二种情况很简单:

Pattern pattern = Pattern.compile("([az\\d])\\1\\1", Pattern.CASE_INSENSITIVE); 

由于\\1表示与组1匹配的部分,因此将匹配范围为az或为数字( \d )的三个相同字符的任何序列。

对于第二个问题:

 \\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 

我不同意,案例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

据我所知,第一种情况确实是不可能的。 正则表达式引擎对自然数字或字母表的顺序一无所知。 但至少可以区分3个或更多数字和3个或更多字母,例如:

 [az]{3,}|[AZ]{3,}|\d{3,} 

例如,这与abcdABCDE123匹配,但与ab2dA5c412z不匹配。 据此,第二种情况可以在较短的版本中正确给出:

  (\w)\1{2,} 

3个或更多连续的连续字符/数字ex-123,abc,789,pqr等。

正则表达式不可能。

3个或更多连续相同的字符/数字ex-111,aaa,bbb。 222等

使用(?i)(?:([a-z0-9])\\1{2,})*

如果要检查整个字符串,请使用Matcher.matches() 。 要在字符串中查找匹配项,请使用Matcher.find()

这是一些示例代码:

 final String ps = "(?i)(?:([a-z0-9])\\1{2,})*"; 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])\1{2,})* (?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 

谢谢大家帮助我。

对于第一种情况 – 3个或更多连续的连续字符/数字; 例如123,abc,789,pqr等。我使用下面的代码逻辑。 请与您分享您的意见。

 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; } 

匹配三个连续数字或字母的正则表达式是“([0-9] | [aA-zZ])\ 1 \ 1”

如果你有下限(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|([az\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|([az\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|([az\d])\1\1\1\1 

试试第一个问题。

如果在arg中找到3个连续数字或字母,则返回true

 function check(value){ 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')); 

对于第一个问题,如果你的正则表达式较少,那么这是有效的

  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; } } }