正則表達式的威力在於其能夠在模式中包含選擇和循環,正則表達式用一些重復規則來表達循環匹配。
常用的重復如下:
分枝是指制定幾個規則,如果滿足任意一種規則,則都當作匹配成功。具體來說就是用 | 符號把各種規則分開,且條件從左至右匹配。
由於分枝規定,只要匹配成功,就不再對後面的條件加以匹配,所以如果你想匹配有包含關系的內容,請注意規則的順序。
下面是一個使用分枝的例子。
美國的郵政編碼的規則是 5 個數字或者 5 個數字連上 4 個數字,如 12345 或者 54321-1234 ,如果要匹配所有的郵編,則正確的正則表達式為:
d{5}-d{4}|d{5} //錯誤寫法 d{5}|d{5}-d{4}
下面的錯誤寫法,只能匹配到 5 位數字及 9 位數字的前 5 位數字的情況,而不能匹配 9 位數字的郵編。
在正則表達式中,可以用小括號將一些規則括起來當作分組,分組可以作為一個元字符來看待。
分組的例子,驗證 IP 地址:
(d{1,3}.){3}d{1,3}
這是一個簡單的且不完善的匹配 IP 地址的正則表達式,因為它除了能匹配正確的 IP 地址外,還能匹配如 322.197.578.888 這種不存在的 IP 地址。
當然,用這個表達式簡單匹配成功後可以在利用 PHP 的算術比較再加以判斷 IP 地址是否正確。而正則表達式中沒有提供算術比較功能,如果要完全匹配正確的 IP 地址,則需要改進如下:
((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)
該規則關鍵之處在於確定 IP 地址每一段范圍為 0-255 ,然後再重復 4 次即可。在:
25[0-5]|2[0-4]d|[01]?dd?
中,用分枝首先確定了 250-255 和 200-249 。 [01]?dd? 則確定了 0-199 的范圍,綜合起來就是 0-255 。
正則表達式默認的情況下,會在滿足匹配條件下盡可能的匹配更多內容。如 a.*b,用他來匹配 aabab ,它會匹配整個 aabab ,而不會只匹配到 aab 為止,這就是貪婪匹配。
與貪婪匹配對應的是,在滿足匹配條件的情況下盡可能的匹配更少的內容,這就是懶惰匹配。
上述例子對應的懶惰匹配規則為:
a.*?b
如果用該表達式去匹配 aabab ,那麼就會得到 aab 和 ab 這樣兩個匹配結果。
常用的懶惰限定符如下:
模式修正符是標記在整個正則表達式之外的,可以看著是對正則表達式的一些補充說明。
常用的模式修正符如下: