需要一个REGEX模式来匹配

时间:2011-03-17 20:02:01

标签: .net regex

需要帮助验证一个9位数字。

CANNOT BE 
-----------
000000000
111111111
222222222
333333333
444444444
555555555
666666666
777777777
888888888
999999999

4-5个位置不能为00 - 123001234

6-9位置不能为00 - 234550000

九个数字不能连续 - 但目前只有下面的4个四个 -

012345678
123456789
987654321
098765432

我刚刚完成了第一件作品 -

"^(?:(?!0+|1+|2+|3+|4+))\d{9}$"

感谢TON的帮助朋友们。

5 个答案:

答案 0 :(得分:3)

我意识到这不是所要求的,但令我感到震惊的是,作为一个独立的方法,而不是正则表达式,这会更容易。

public bool SanityCheckSSN(string ssn)
{
    if(ssn == null || ssn.Length != 9) return false;

    foreach (char c in ssn)
    {
        if (!Char.IsDigit(c)) return false;
    }

    if(ssn == "000000000" ||
       ssn == "111111111" ||
       ssn == "222222222" ||
       ssn == "333333333" ||
       ssn == "444444444" ||
       ssn == "555555555" ||
       ssn == "666666666" ||
       ssn == "777777777" ||
       ssn == "888888888" ||
       ssn == "999999999" ||
       ssn == "012345678" ||
       ssn == "123456789" ||
       ssn == "987654321" ||
       ssn == "098765432" ||
       ssn.Substring(3, 2) == "00" ||
       ssn.Substring(5, 4) == "0000")
    {
        return false;
    }

    return true;
}

答案 1 :(得分:3)

可能存在验证所有规则的单个正则表达式,但如果为每个条件编写验证规则(可以是正则表达式),它将更容易,可读和可维护。

作为更一般的评论,正则表达式通常很适合检查字符串是什么,但是在检查字符串不是什么时它们并不是那么好。

答案 2 :(得分:3)

如果 是正则表达式(以详细形式编写):

^              # start of string
(?!(.)\1+$)    # not all characters the same
(?!...00)      # pos 4/5 not zero
(?!.....0000)  # pos 6-9 not zero
(?!012345678)  # list of disallowed numbers
(?!123456789)
(?!987654321)
(?!098765432)
[0-9]{9}       # match 9 digits exactly
$              # end of string

答案 3 :(得分:0)

  • 相同的数字:
    ^(\d)\1*$

  • 零组:
    ^\d{3}00
    ^\d{5}0*$

  • 序列:
    ^0?123456789?$
    ^9?876543210?$

全部放在一起:

^(?!(\d)\1*$)
 (?!\d{3}00)(?!\d{5}0*$)
 (?!0?123456789?$)(?!9?876543210?$)
 \d{9}$

答案 4 :(得分:0)

除了你的“不能顺序”规则之外的一切,我不明白。

^(?!(\d)\1+$)\d{3}(?!0{2})\d{2}(?!0{4})\d{4}$

击穿:

^         # start-of-string
(?!       # negative look-ahead (not followed by)
  (\d)    #   a digit, store in group 1
  \1+$    #   the contents for group 1, repeated until end-of-string
)         # end negative look-ahead
\d{3}     # three digits
(?!       # negative look-ahead (not followed by)
  0{2}    #   two consecutive zeros 
)         # end negative look-ahead
\d{2}     # two digits
(?!       # negative look-ahead (not followed by) 
  0{4}    #   four consecutive zeros
)         # end negative look-ahead
\d{4}     # four digits
$         # end-of-string

话虽如此,以上是使用专用函数代替正则表达式的一个很好的理由。