正規表達式比對數字範圍,比對單個數字的方式很簡單,[0-9]是[0123456789]的簡寫形式,可以用來比對任何一個數字。如果要比對 0 到 255 中的所有數字,該怎麼辦呢?表達式[0-255]并不能達到目的。
下表所示為數字元字元
元字元
說明
\d
任何一個數字字元(等價于[0-9])
\D
任何一個非數字字元(等價于[^0-9])
正規表達式是為了比對字元而設計的,而并不是為了比對數字,是以當你使用正則比對指定範圍内的數字的時候你需要額外小心。表達式[0-255]并不能比對0至255之間的數字。表達式[0-255]是一個字元集,它的含義是比對 0,1,2,5中任意一個字元,這個表達式等同于[0125]。
正則引擎真正處理的是字元,是以數字0對于引擎來說是一個字元,而255對于引擎來說是長度為3的字元。是以如何要比對0至255中的所有數字,我們需要讓引擎比對長度為一到三之間的字元。
[0-9] 可以比對0~9之間的數字。
[1-9][0-9] 可以比對10~99之間的數字。
[1-9][0-9][0-9] 可以比對100~999之間的數字
但是比對0~255略微複雜一點,因為我們要排除256至999之間的整數。
1[0-9][0-9]可以比對100至199。
2[0-4][0-9]可以比對200至249。
25[0-5]可以比對250至255。
你可以發現當我們比對0到255之間的整數時,我們需要按照字元的長度來分割這個範圍。在比對三位整數的時候,如果百位是 1 ,那麼十位和個位允許出現 0 至 9 之間的10個字元,如果百位是 2 ,那麼十位和個位的字元将進一步做限制。
把前面三個部分用選擇符連接配接起來,我們就得到了0隻255之間所有的整數:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]。
但是這個方法還存在一個缺陷:正規表達式通常允許部分比對,是以這個表達式可以比對到 12345 中的 123。
如下兩種方法可以解決問題:
(1)詞語邊界
如果你在一個文檔中所搜數字,你可以使用詞語邊界鎖定數字的範圍:\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b。因為選擇符的優先級是最低的,是以我們要在選擇外加上括号。這樣引擎會先比對第一個邊界符\b,然後比對整個選擇符,最後比對最後一個\b。
(2)位置字元
如果你想驗證使用者輸入内容,那麼或許你想驗證的是使用者輸入的完整内容,而不是其中的部分。你可以使用位置字元:^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$。
以下一些常用的數字比對:
000..255: ^([01][0-9][0-9]|2[0-4][0-9]|25[0-5])$
0 or 000..255: ^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$
0 or 000..127: ^(0?[0-9]?[0-9]|1[01][0-9]|12[0-7])$
0..999: ^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$
000..999: ^[0-9]{3}$
0 or 000..999: ^[0-9]{1,3}$
1..999: ^([1-9]|[1-9][0-9]|[1-9][0-9][0-9])$
001..999: ^(00[1-9]|0[1-9][0-9]|[1-9][0-9][0-9])$
1 or 001..999: ^(0{0,2}[1-9]|0?[1-9][0-9]|[1-9][0-9][0-9])$
0 or 00..59: ^[0-5]?[0-9]$
0 or 000..366: ^(0?[0-9]?[0-9]|[1-2][0-9][0-9]|3[0-5][0-9]|36[0-6])$
正整數: ^[0-9]*[1-9][0-9]*$
負整數: ^-[0-9]*[1-9][0-9]*$
整數: ^-?d $
浮點數: ^(-?d )(.d )?$
正浮點數: ^(([0-9] .[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9] )|([0-9]*[1-9][0-9]*))$
複浮點數: ^(-(([0-9] .[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9] )|([0-9]*[1-9][0-9]*)))$
更多常用正規表達式,請參考常用正規表達式彙總