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