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

检查 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,[\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,

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

  (\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 个或更多连续连续字符和连续相同字符的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

java 正则表达式 包含字母数字特殊字符

sql正则匹配连续增加数字

正则如何匹配某字符之后的内容

正则表达式学习整理

利用正则匹配连续重复的字符:1

python输出连续的字母正则表达式