>[danger]不幸的是,剛才那個表達式也能匹配*010)12345678*或*(022-87654321*這樣的“不正確”的格式。
要解決這個問題,我們需要用到**分枝條件**。正則表達式里的**分枝條件**指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。聽不明白?沒關系,看例子:
>[success]0\\d{2}-\\d{8}|0\\d{3}-\\d{7}
這個表達式能匹配兩種以連字號分隔的電話號碼:
一種是三位區號,8位本地號(如010-12345678),
一種是4位區號,7位本地號(0376-2233445)。
>[success]\\(0\\d{2}\\)\[- \]?\\d{8}|0\\d{2}\[- \]?\\d{8}
這個表達式匹配3位區號的電話號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字號或空格間隔,也可以沒有間隔。你可以試試用分枝條件把這個表達式擴展成也支持4位區號的。
>[success]\\d{5}-\\d{4}|\\d{5}
這個表達式用于匹配美國的郵政編碼。美國郵編的規則是5位數字,或者用連字號間隔的9位數字。
之所以要給出這個例子是因為它能說明一個問題:**使用分枝條件時,要注意各個條件的順序**。
如果你把它改成\\d{5}|\\d{5}-\\d{4}的話,那么就只會匹配5位的郵編(以及9位郵編的前5位)。
原因是匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了。