01 = match
10 = match
99 = match
00 = no match
到目前为止,我有这样的:/^ [1-9][0-9] | [0-9][1-9] $/
但它可以优化我有感觉。
01 = match
10 = match
99 = match
00 = no match
到目前为止,我有这样的:/^ [1-9][0-9] | [0-9][1-9] $/
但它可以优化我有感觉。
您可以使用负前瞻限制通用[0-9]{2}
模式:
^(?!00)[0-9]{2}$
的[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
可能更好,因为它匹配字符串的非常结尾)。试试这个正则表达式:
(?!00)\d\d
这将使用Negative Lookahead(这里是一个nice answer解释它),(?!)
。这意味着无论内部存在什么,都不匹配。在这种情况下,它将检测是否存在00
,如果存在则失败。如果没有,选择了2位(\d
是[0-9]
简写)
一个更安全的版本:
^(?!00)\d\d$
这也采用^
,其中指出,数据必须是在字符串的开头(或带有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
'\ d \ D'也将匹配'9900'中的'99'。 –
@WiktorStribiżew我认为只有2位数字,特别是因为您在答案中使用了“{2}”。如果有,那么'9900'将不会存在。但谢谢你通知我! – Druzion
限制量词不会指示输入中应该有多少个字符,但前面的子模式可以匹配多少个字符。 –