如何匹配任何两个数字的正则表达式不是零?

时间:2016-04-05 12:43:09

标签: regex

实施例

01  =  match
10  =  match
99  =  match
00  =  no match

到目前为止,我有这个:/^ [1-9][0-9] | [0-9][1-9] $/但我觉得可以优化它。

2 个答案:

答案 0 :(得分:6)

您可以使用否定前瞻来限制通用[0-9]{2}模式:

^(?!00)[0-9]{2}$

请参阅regex demo

[0-9]{2}将完全匹配2位数。 (?!00) negative lookahead将在字符串的开头执行一次,并确保在字符串结束之前没有00。如果字符串等于00,则不会找到匹配项。

请参阅How Negative Lookahead Works

详细的模式说明:

  • ^ - 字符串开头
  • (?!00) - 如果在当前位置之后有两个0 s(在字符串的开头),则会导致匹配失败的负向前瞻。由于下一个子模式 - [0-9]{2}$ - 只允许字符串中有2个符号,因此我们不必在前瞻中添加任何锚点,在其他情况下,必须添加$才能排除{ {1}}匹配。
  • 00 - 正好两个(感谢限制量词[0-9]{2})数字(在大多数情况下,{min(,max)?}可以替换为[0-9],但\d在一些风格中,也可以比常规的\d更多匹配)
  • [0123456789] - 字符串结尾(取决于正则表达式的风格,$可能更合适,因为它与字符串的结束匹配。)

答案 1 :(得分:1)

试试这个RegEx:

(?!00)\d\d

Live Demo on Regex101

这使用Negative Lookahead(此处为nice answer解释),(?! )。这意味着内部存在的任何东西,都不匹配。在这种情况下,它将检测是否存在00,如果存在则会失败。如果没有,请选择2位数(\d[0-9]的简写)

更安全的版本:

^(?!00)\d\d$

Live Demo on Regex101

这也使用^,它指出数据必须位于字符串的开头(或带有m标志的行),并且$数据必须位于结束。因此,当您使用^ $时,内部数据必须与整行/字符串匹配

以下是负面前瞻的一些例子:

# Using the RegEx (?!9)\d
1    # Match
2    # Match
5    # Match
9    # NO MATCH

# Using the RegEx (?!Tom)\w+
Tim    # Match
Joe    # Match
Bob    # Match
Tom    # NO MATCH

# Using the RegEx (?!Foo)\w+(?!Bar)
BarBazFoo    # Match
BazBarFoo    # Mtach
FooBarBaz    # NO MATCH
BazFooBar    # NO MATCH