1、子表達式
子表達式是一個更大的表達式的一部分,把一個表達式划分為一系列表達式的目的是為了把那些表達式當作一個獨立元素來使用。子表達式必須用(和)括起來。
注意:(和)是元字符,如果需要匹配(和)本身,就必須使用它的轉義序列\(和\) 。子表達式是可以提高可讀性,對表達式的實際行為也沒有任何不良影響,但對匹配操作的速度可能會有點兒影響。
hello,my name is Ben Forta,and I am the author of books on SQL ,ColdFusion,WAP,Windows 2000,and other subjects. 正則表達式 {2,} 匹配結果 無
{2,}本意是希望它能匹配 連續兩次或更多次。因為{2,}緊跟着它的前一個字符,那就是也分號。
要想匹配 ,則要把 當作一個表達式。
hello,my name is Ben Forta,and I am the author of books on SQL ,ColdFusion,WAP,Windows 2000,and other subjects. 正則表達式 ( ){2,} 匹配結果
( )就是一個子表達式。( ){2,}實現匹配
pinging hog.forta.com [12.159.46.200] with 32 bytes of data; 正則表達式 \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 匹配結果 12.159.46.200 正則表達式 (\d{1,3}\.){3}\d{1,3} 匹配結果 12.159.46.200
(和)把表達式\d{1,3}\.括起來使它成為了一個子表達式,再用(\d{1,3}\.){3}把這個子表達式重復3次
1967-08-10 正則表達式 19|20\d{2} 匹配結果 19
這個模式里|字符是正則表達式語言里的或操作符。19|20將匹配19或20
19|20\d{2}應該匹配以19或20開頭的4位數字,可是這個模式的匹配結果與我們預期的並不相符。因為它會把模式19|20\d{2}解析成19或20\d{2}
1967-08-10 正則表達式 (19|20)\d{2} 匹配結果 1967
(19|20)就是一個子表達式,意思:以19或20開頭的一個4位數字
2、子表達式的嵌套
子表達式允許多重嵌套,這種嵌套的層次理論上沒有限制,但在實際工作中還是應該遵循適可而止的原則。
上面的IP正則表達式(\d{1,3}\.){3}\d{1,3},從語法上講,它完全正確。但是也能匹配不合法的iP地址。比如900.123.456.589
Ip地址由4個字節構成,iP地址每組數字取值范圍也就是單個字節的表示范圍,即0~255,這意味着每一組數字都不能大於255。
注意:把必須匹配的情況考慮周全並寫出一個匹配結果符合預期的正則表達式很容易,但把不需要匹配的情況也考慮周全並確保他們都將被排除在匹配結果以外往往要困難得多。
在構造一個正則表達式的時候,一定要把你想匹配什么和你不想匹配什么詳盡的定義清楚。下面是一個合法的IP地址里的各組數字必須且只能符合的規則,我們隨后根據這些規則來構造一個相應的模式。
1.任何一個1位或2位數字
2.任何一個以1開頭的3位數字
3.任何一個以2開頭、第二位數字在0~4之間的3位數字
4.任何一個以25開頭、第3位數字在0~5之間的3位數字
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
(\d{1,2})匹配范圍0~99
(1\d{2})匹配范圍100~199
(2[0-4]\d)匹配范圍200~249
(25[0-5])匹配范圍250~255
上面的iP正則表達式准確無誤地做到了只匹配合法的IP地址、不匹配非法的IP地址。
在分析子表達式的時候,應該按照先內后外的原則來進行而不是從第一個字符開始一個字符一個字符地去嘗試。而應該把表達式分解為一個個子表達式,每次只分析和理解一個子表達式。