15.12.1 問(wèn)題
如何在一個(gè)文本中, 尋找一些有效的IP 地址呢?
15.12.2 解決辦法
可以使用子表達(dá)式去驗(yàn)證IP 地址中的每個(gè)3 位數(shù)組是否有效。
15.12.3 討論
根本上一章(章節(jié)15.11)所學(xué)習(xí)過(guò)的內(nèi)容, 一個(gè)包含1 位和3 位數(shù)目字的IP 地址可以用”/d”標(biāo)記來(lái)匹配的。
/d{1,3}
如果你想為3 組包含1 和4 位數(shù)的數(shù)組進(jìn)行匹配, 可以這樣做:
(/d{1,4}){3}
就如”/d{3}”可以用來(lái)匹配”333”一樣, 你可以通過(guò)創(chuàng)建子表達(dá)式來(lái)進(jìn)行匹配。子表達(dá)式本身就是一個(gè)獨(dú)立的元素, 跟表達(dá)中其他的模式有著相同的地位。比如說(shuō)一個(gè)IP 地址, 當(dāng)中包含著4 組3 位數(shù)的數(shù)組。你可以把它分成3 組3 位數(shù)組跟1 組3 位數(shù)組來(lái)處理, 這樣做會(huì)比較方便:
(/d{1,3}/.){3}/d{1,3}
可是, 這個(gè)方法是有問(wèn)題的, 它給返回一個(gè)像這樣子的字符串: 838.381.28.999, 而非一個(gè)有效的IP 地址。要解決這個(gè)問(wèn)題, 你需要把每個(gè)3 位數(shù)組的最大值限制為255。通過(guò)使用子表達(dá)式, 可以這樣做:
代碼如下:
(((/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]))
首先, 先對(duì)代碼的前面部分中作個(gè)深入的了解:
(((/d{1,2})|(1/d{2})|(2[0-4]/d)|(25[0-5]))/.){3}
在這段代碼中, 你會(huì)看到4 個(gè)主要部份:
(/d{1,2}) 表示包含著”1”或者”2”的數(shù)字或者
(1/d{2}) 表示“1”隨后跟著兩個(gè)數(shù)目或者
(2[0-4]/d) 表示“2” 隨后跟著兩個(gè)”0 至4” 范圍內(nèi)的數(shù)字或者
(25[0-5]) 表示“25” 隨后跟著1 個(gè)”0 至5” 范圍內(nèi)的數(shù)位
最后”/.”及{3}代表包含著3 組根據(jù)以上規(guī)則的數(shù)組并以”.”號(hào)分隔。
最后還有一組子表達(dá)式代表著第4 組數(shù)組:
((/d{1,2})|(1/d{2})|(2[0-4]/d)|(25[0-5]))
它跟之前的表達(dá)式很相似, 只是去除了尾端的”.”號(hào)。這是由于一個(gè)正確的IP 地址(例如:
192.168.0.1), 尾端的是沒(méi)有”.”號(hào)的。
以下是一些有關(guān)子表達(dá)式的語(yǔ)法功能:
{n}代表最少執(zhí)行n 次。
{n,m}代表最少執(zhí)行n 次但不多于m 次。