天天看點

php 正則比對數字範圍,正規表達式比對數字範圍

正規表達式比對數字範圍,比對單個數字的方式很簡單,[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]*)))$

更多常用正規表達式,請參考常用正規表達式彙總