正則表達(dá)式匹配ip地址超詳細(xì)講解
一、正則匹配基本知識及概念
在練習(xí)之前,需要大家知道一些基本知識,如果有一定基礎(chǔ)的可以跳過該步驟,直接往下看。
正則表達(dá)式-字符類
[abc]:代表a或者b,或者c字符中的一個。
[^abc]:代表除a,b,c以外的任何字符。
[a-z]:代表a-z的所有小寫字符中的一個。
[A-Z]:代表A-Z的所有大寫字符中的一個。
[0-9]:代表0-9之間的某一個數(shù)字字符。
[a-zA-Z0-9]:代表a-z或者A-Z或者0-9之間的任意一個字符。
[a-dm-p]:a 到 d 或 m 到 p之間的任意一個字符。
正則表達(dá)式-邏輯運算符
&&:并且
| :或者(可以省略)
正則表達(dá)式-預(yù)定義字符
“.” : 匹配任何字符。
“\d”:任何數(shù)字[0-9]的簡寫;
“\D”:任何非數(shù)字[^0-9]的簡寫;
“\s”: 空白字符:[ \t\n\x0B\f\r] 的簡寫
“\S”: 非空白字符:[^\s] 的簡寫
“\w”:單詞字符:[a-zA-Z_0-9]的簡寫
“\W”:非單詞字符:[^\w]
正則表達(dá)式-數(shù)量詞
x? : 0次或1次
x* : 0次到多次
x+ : 1次或多次
X{n} : 恰好n次
X{n,} : 至少n次
X{n,m}: n到m次(n和m都是包含的,最少n次,最多m次。
二、ip地址匹配
題目要求:使用正則表達(dá)式匹配192.11.23.69
須知:ip地址的范圍為0.0.0.0-255.255.255.255
接下來我們直接進(jìn)入正題吧!在我們看到題目的第一眼,大家可能覺得很簡單,這不就用\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
這里我們可以看到使用上述表達(dá)式的確匹配成功。
雖然完成了我們的題目要求,有些細(xì)心的伙伴會發(fā)現(xiàn),用紅色標(biāo)注出來的部分,重復(fù)了三遍,是不是我們可以用分組的方式來簡化表達(dá)式并完成題目要求。我們把上面的匹配表達(dá)式換成分組之后的樣子,即(\d{1,3}\.){3}\d{1,3}
表達(dá)式講解:(\d{1,3}\.) 匹配我們前三段的ip地址和’.‘,因為第四段ip地址最后面不能有’.',如果我們使用在同一個分組去匹配就會出現(xiàn)錯誤情況,而\d{1,3}剛好匹配我們最后一段ip地址
匹配效果如下:
匹配同樣成功,該模式有什么不對的地方嗎?從語法上看,完全正確,也達(dá)到了我們的題目要求,可是我們有沒有注意到,我們?nèi)粘I钪兴玫膇p地址每一位都是在0-255之間,但是我們上面寫的表達(dá)式會匹配0-999之間的所有ip地址,如果在未來的工作中,有這樣的需求,要匹配所有合法的ip地址,那么我們上面所寫的正則表達(dá)式是不是就不符合要求了,這里就需要我們使用子表達(dá)式的嵌套(注意:有一點很重要。通過上面的例子,我們發(fā)現(xiàn),寫一個能夠匹配預(yù)期內(nèi)容的正則表達(dá)式其實并不難,但是寫一個能夠考慮到所有可能場景,確保將不需要匹配的內(nèi)容排除在外的正則表達(dá)式就困難多了)
所以我將上面的表達(dá)式又改進(jìn)了一下(這里用到了子表達(dá)式的嵌套,如果不懂的小伙伴可以先看一下基本概念再來看接下來的內(nèi)容)。我們發(fā)現(xiàn)當(dāng)ip地址僅有一位或者兩位的時候(即1.1.1.1 or 11.11.11.11),用(\d{1,2}\.)就可以完成匹配,當(dāng)ip地址為三位的時候,會有這么兩種情況(這里留下個疑問,考慮到初學(xué)者可能犯錯的情況)?
1:ip地址開頭為1的時候,我們后面的兩位每一位的范圍都在0-9之間,而\d這個元字符剛好滿足了我們的要求,所以使用(1\d{2}.)就滿足了我們在100-199ip地址的匹配,這個其實還相對簡單,接下來就是200-255之間ip地址的匹配了,有些同學(xué)可能會想,我們可以使用匹配100-199的表達(dá)式來實現(xiàn)對200-255ip地址的匹配,即(2\d{2}\.)這樣的表達(dá)式來實現(xiàn),可是這樣會把256-299之間的ip地址匹配到,違反了我們的意愿,所以我改良了一下表達(dá)式(2[0-5]{2}\.]),這樣就只會匹配到200-255之間的ip地址,既然子表達(dá)式都寫好了,就讓我們來實踐看看效果吧!
表達(dá)式為:((1\d{2}.)|(2[0-5]{2}.)|(\d{1,2}.)){3}((\d{1,2})|(1\d{2})|(2[0-5]{2}))),伙伴們可以一起實踐一下!
匹配成功,可是再寫出這個表達(dá)式,我們要測試某些特殊情況是否不在我們的匹配范圍內(nèi),于是我發(fā)現(xiàn)了以下兩個比較重要的問題。
第一種:
合法ip地址匹配錯誤
第二種:
非法ip地址匹配成功
為什么會出現(xiàn)上面的情況?
當(dāng)我們覺得表達(dá)式很完美的時候,雖然256超出匹配范圍,但是因為(\d{1,2}\.)的影響,使得我們的非法表達(dá)式也匹配成功,本來192.11.23.200為合法表達(dá)式,卻只匹配到了98.11.23.200,請大家看我用紅色箭頭標(biāo)注的地方,會不會跟我們子表達(dá)式的順序有關(guān)呢?那好,我來改變一下順序,我們將(\d{1,2}\.)放到了最后,防止出現(xiàn)錯誤匹配
改變匹配順序后的表達(dá)式為:
( ( (2[0-5]{2}.)|(1\d{2}.)|(\d{1,2}.)){3}((1\d{2})|(2[0-5]{2})|(\d{1,2})))
果然,第一種情況我們是因為子表達(dá)式順序的原因,導(dǎo)致匹配錯誤。
可是第二種情況使用改變順序的表達(dá)式,依然會出現(xiàn)以上問題(這里也就印證了上文提到的那些話,要想寫出一個符合規(guī)范的表達(dá)式就很困難)。
于是這里的^就起到了作用,我們可以把第一個子表達(dá)式單另拉出來加上^表示第一段ip地址開頭為(\d{1,2}),這樣剛好避免了我們?nèi)缟系那闆r,效果如下:
可以看到非法ip不在我們的匹配當(dāng)中。
其實寫到這里大家是不是感覺已經(jīng)大功告成了?回答:No
(2[0-5]{2})這個表達(dá)式能否匹配239這個ip呢?不知道有沒有細(xì)心的小伙伴發(fā)現(xiàn)
所以最終正確的表達(dá)式應(yīng)該為:
(^((2[0-4]\d.)|(25[0-5].)|(1\d{2}.)|(\d{1,2}.))((2[0-5]{2}.)|(1\d{2}.)|(\d{1,2}.){2})((1\d{2})|(2[0-5]{2})|(\d{1,2})))
在這里可以跟大家說一下,是否可以使用$來避免我們上述第一種問題,有興趣的可以嘗試一下
附正則表達(dá)式匹配IP地址小結(jié)
1. IP段都表示一個字節(jié),即只能在 0~255之間。
所以一個正確的IP應(yīng)該是:(0~255) .(0~255) .(0~255) .(0~255)
通過觀察可以發(fā)現(xiàn)可以將整個IP分為兩部分匹配,即:(0~255) 和 .(0~255) 3次
2. 0~255可以分兩部分匹配 0~199 和 200~255
a) 0~199 正則表達(dá)式為 [0-1]?\d{1,2}
[0-1]? 表示匹配 0或1一次或零次
\d 表示匹配任意一個十進(jìn)制數(shù)字,即 0~9
{1,2} 表示匹配上一個元素至少一次,最多兩次,這里就是 \d一次或兩次
b) 200~255 正則表達(dá)式為 2((5[0-5])|([0-4]\d)),又可以分為兩部分 200~249 和 250~255
2 表示必須以2開頭
5[0-5] 表示匹配 50~55 之間的數(shù)
[0-4]\d 表示 00~49 之間的數(shù)
3.三個部分的正則匹配
a) (0~255) 的正則表達(dá)式可以寫為 (2((5[0-5])|([0-4]\d)))|([0-1]?\d{1,2})
b) .(0~255) 的正則表達(dá)式可以寫為 .((2((5[0-5])|([0-4]\d)))|([0-1]?\d{1,2}))
c) .(0~255) 匹配3次的正則表達(dá)式可以寫為 (.((2((5[0-5])|([0-4]\d)))|([0-1]?\d{1,2}))){3}
總結(jié)
到此這篇關(guān)于正則表達(dá)式匹配ip地址的文章就介紹到這了,更多相關(guān)正則表達(dá)式匹配ip地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
eregi_replace與preg_replace 函數(shù)代碼的用法比較
eregi_replace與preg_replace 函數(shù)代碼的用法比較...2007-03-03javascript用正則表達(dá)式把1234567890替換為abcdefghij
javascript用正則表達(dá)式把1234567890替換為abcdefghij...2007-06-06linux下關(guān)于正則表達(dá)式grep的一點總結(jié)
正則表達(dá)式(Regular Expression)是用于描述一組字符串特征的模式,用來匹配特定的字符串。通過特殊字符+普通字符來進(jìn)行模式描述,從而達(dá)到文本匹配目的工具2020-04-04