0

我需要编写一个完全满足以下条件的正则表达式:

  1. 值将是一个正好 6 位的数字
  2. 不允许连续 6 位数字(例如 123456、654321、234567 等不允许)
  3. 不超过 2 个重复数字允许(例如 111234、123444、123334 不允许,但 112345、123455、123345 是允许的)

我正在尝试编写此正则表达式,但失败了。请注意,我可以单独为该条件编写正则表达式,但我需要一个组合正则表达式。请尽快帮助我。

我得到了一个只满足我的第一个和第二个标准的解决方案:

string re = @"(?x)
        ^
        # fail if...
        (?!
            # repeating numbers
            0{3,}|1{3,}|2{3,}|3{3,}|4{3,}|5{3,}|6{3,}|7{3,}|8{3,}|9{3,}$
            |
            # sequential ascending
            (?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){5} \d $
            |
            # sequential descending
            (?:0(?=9)|1(?=0)|2(?=1)|3(?=2)|4(?=3)|5(?=4)|6(?=5)|7(?=6)|8(?=7)|9(?=8)){5} \d $
        )
        # match any other combinations of 6 digits
        \d{6}
        $
    ";

但是,我需要完全满足我的 3 个标准的完整解决方案(组合正则表达式)。

4

2 回答 2

1

您可以尝试将第一个条件更改为:

\d*(\d)(?:\d*\1){2,}\d*$

(\d)(?:\d*\1){2,}将匹配超过 2 个重复数字(连续或不连续),并且\d*允许在重复部分之前或之后有任意数量的数字。

这意味着您的新正则表达式变为:

string re = @"(?x)
        ^
        # fail if...
        (?!
            # repeating numbers
            \d*(\d)(?:\d*\1){2,}\d*$
            |
            # sequential ascending
            (?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){5} \d $
            |
            # sequential descending
            (?:0(?=9)|1(?=0)|2(?=1)|3(?=2)|4(?=3)|5(?=4)|6(?=5)|7(?=6)|8(?=7)|9(?=8)){5} \d $
        )
        # match any other combinations of 6 digits
        \d{6}
        $
    ";

正则表达式101演示

于 2013-09-25T08:36:31.967 回答
0

试试程序正则表达式教练。在将正则表达式插入 C# 程序之前,您可以在那里更好更快地分析正则表达式并使其工作。

如果你不喜欢那么长的正则表达式,你总是可以制作 3 个正则表达式对象和/或它们。

于 2013-09-25T08:16:58.730 回答