2016-04-05 44 views

回答

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个符号,所以我们不必在预见中添加任何锚点,在其他情况下,必须添加$以排除00匹配。
  • [0-9]{2} - 整整两个(感谢限制量词{min(,max)?})数字(在大多数的口味,[0-9]可以用\d取代,但\d也可以搭配比普通[]更多一些口味)
  • $ - 结束的字符串(取决于正则表达式的风格,\z可能更好,因为它匹配字符串的非常结尾)。
1

试试这个正则表达式:

(?!00)\d\d 

Live Demo on Regex101

这将使用Negative Lookahead(这里是一个nice answer解释它),(?!)。这意味着无论内部存在什么,都不匹配。在这种情况下,它将检测是否存在00,如果存在则失败。如果没有,选择了2位(\d[0-9]简写)


一个更安全的版本:

^(?!00)\d\d$ 

Live Demo on Regex101

这也采用^,其中指出,数据必须是在字符串的开头(或带有m标志的行)和$数据必须在最后。因此,当您使用^ $,里面的数据必须在全行/串


以下匹配是负先行的一些例子:(?!00)

# 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 
+0

'\ d \ D'也将匹配'9900'中的'99'。 –

+0

@WiktorStribiżew我认为只有2位数字,特别是因为您在答案中使用了“{2}”。如果有,那么'9900'将不会存在。但谢谢你通知我! – Druzion

+0

限制量词不会指示输入中应该有多少个字符,但前面的子模式可以匹配多少个字符。 –

相关问题