【问题标题】:Regular Expression to match 3 or more Consecutive Sequential Characters and Consecutive Identical Characters匹配 3 个或更多连续连续字符和连续相同字符的正则表达式
【发布时间】:2012-02-11 09:34:17
【问题描述】:

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

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

【问题讨论】:

  • 如果你想要一个在字符串不包含 3 个连续相同字符的情况下通过的正则表达式,你可以使用这个:/^(?!.*(.)\1\1.*).*$/ - regex101.com/r/hxTDfr/2

标签: java regex pattern-matching


【解决方案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 有一个很好的解决方案。

      检查 abcbcd 或 ... 或 012123 甚至任何数量的连续字符,试试:

      .*((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,}[\p{Alpha}])
                

                https://regex101.com/r/5IragF/1

              • 3 个或更多连续相同的字符/数字;例如111、aaa、bbb、222等

                ([\p{Alnum}])\1{2,}
                

                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) 内的三个相同字符的任何序列。

                  【讨论】:

                  【解决方案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])\\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
                    

                    【讨论】:

                    • 您的第一个模式将匹配非连续字符(即vbgt
                    • 糟糕,把它留在里面了。更正了。
                    • 如何检查字符串是否有一组 3 个或更多连续的相似字符(.....CCC....),字符串不应该有 3 个连续的相似字符。例如。它不应该接受 1. AAA 2. AAAAAAA 3. AAAAR
                    【解决方案14】:

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

                    [a-z]{3,}|[A-Z]{3,}|\d{3,}
                    

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

                      (\w)\1{2,}
                    

                    【讨论】:

                    • \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+
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-03-12
                    相关资源
                    最近更新 更多