筆者最近在學習解釋器設計模式的時候注意到了正則表達式的相關內容,忽然想起以前一直都有的一個疑問。如何使用正則表達式匹配出一個正確的ip地址。正則表達式
一個正確的ip地址是由幾個小於255的數字組成的,考慮如何匹配出一個正確的小於255的數字,咱們能夠劃分爲個位十位百位,針對不一樣的狀況來匹配。設計模式
注意到有如下幾種狀況:學習
1. 百位和十位爲空,這時候個位一定包含一個數因此這裏的表示能夠是 0{0,2}[0-9]設計
2. 百位爲空,十位個位包含數據,使用正則表達式能夠是0?[0-9]{2},結合1和2兩步咱們能夠使用這樣的正則表達式0?[0,9]{1,2}ip
3. 百位爲1,這種狀況應該使用的正則表達式爲1[0-9]{2},結合1,2,3步咱們能夠使用這樣的正則表達式[01]?[0-9]{1,2}數據
4. 百位爲2,這種狀況下十位分兩種狀況,0-4時,個位能夠爲0-9;當十位爲5時,個位只能是0-5. 如此咱們獲得下面的正則表達式2[0-4][0-9] 和 25[0-5]兩種狀況數字
結合1,2,3,4 中狀況獲得一個獲取小於255的數的正則表達式[01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]閱讀
接下來看看ip,ip是由4個小於255的整數來表示的。爲了方便閱讀咱們使用一個特殊符號來表示小於255整數的正則表達式,姑且用€表示。
則ip能夠表示爲€.€.€.€,簡化一下能夠表示成(€\.){3}€。這時咱們帶入小於255的正則表達式,則結果表示爲(([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]) 引入單詞匹配「\<」 和 "\>",最終結果爲\<(([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\>。這樣就能匹配出正確的IP了。