2016-04-05 43 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

限制量詞不會指示輸入中應該有多少個字符,但前面的子模式可以匹配多少個字符。 –

相關問題