欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

正則表達式匹配ip地址超級詳細(xì)講解

 更新時間:2023年12月27日 09:42:22   作者:darkfive  
這篇文章主要給大家介紹了關(guān)于正則表達式匹配ip地址超級詳細(xì)講解的相關(guān)資料,IP地址正則表達式由四個部分組成,每個部分都是由一個或多個數(shù)字或數(shù)字區(qū)間組成,中間用.連接,需要的朋友可以參考下

一、正則匹配基本知識及概念

在練習(xí)之前,需要大家知道一些基本知識,如果有一定基礎(chǔ)的可以跳過該步驟,直接往下看。

正則表達式-字符類

[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之間的任意一個字符。

正則表達式-邏輯運算符

&&:并且
| :或者(可以省略)

正則表達式-預(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]

正則表達式-數(shù)量詞

x? : 0次或1次
x* : 0次到多次
x+ : 1次或多次
X{n} : 恰好n次
X{n,} : 至少n次
X{n,m}: n到m次(n和m都是包含的,最少n次,最多m次。

二、ip地址匹配

題目要求:使用正則表達式匹配192.11.23.69

須知:ip地址的范圍為0.0.0.0-255.255.255.255

接下來我們直接進入正題吧!在我們看到題目的第一眼,大家可能覺得很簡單,這不就用\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

zh

這里我們可以看到使用上述表達式的確匹配成功。

雖然完成了我們的題目要求,有些細(xì)心的伙伴會發(fā)現(xiàn),用紅色標(biāo)注出來的部分,重復(fù)了三遍,是不是我們可以用分組的方式來簡化表達式并完成題目要求。我們把上面的匹配表達式換成分組之后的樣子,即(\d{1,3}\.){3}\d{1,3}

表達式講解:(\d{1,3}\.) 匹配我們前三段的ip地址和’.‘,因為第四段ip地址最后面不能有’.',如果我們使用在同一個分組去匹配就會出現(xiàn)錯誤情況,而\d{1,3}剛好匹配我們最后一段ip地址

匹配效果如下:

匹配同樣成功,該模式有什么不對的地方嗎?從語法上看,完全正確,也達到了我們的題目要求,可是我們有沒有注意到,我們?nèi)粘I钪兴玫膇p地址每一位都是在0-255之間,但是我們上面寫的表達式會匹配0-999之間的所有ip地址,如果在未來的工作中,有這樣的需求,要匹配所有合法的ip地址,那么我們上面所寫的正則表達式是不是就不符合要求了,這里就需要我們使用子表達式的嵌套(注意:有一點很重要。通過上面的例子,我們發(fā)現(xiàn),寫一個能夠匹配預(yù)期內(nèi)容的正則表達式其實并不難,但是寫一個能夠考慮到所有可能場景,確保將不需要匹配的內(nèi)容排除在外的正則表達式就困難多了)

所以我將上面的表達式又改進了一下(這里用到了子表達式的嵌套,如果不懂的小伙伴可以先看一下基本概念再來看接下來的內(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的表達式來實現(xiàn)對200-255ip地址的匹配,即(2\d{2}\.)這樣的表達式來實現(xiàn),可是這樣會把256-299之間的ip地址匹配到,違反了我們的意愿,所以我改良了一下表達式(2[0-5]{2}\.]),這樣就只會匹配到200-255之間的ip地址,既然子表達式都寫好了,就讓我們來實踐看看效果吧!

表達式為:((1\d{2}.)|(2[0-5]{2}.)|(\d{1,2}.)){3}((\d{1,2})|(1\d{2})|(2[0-5]{2}))),伙伴們可以一起實踐一下!

匹配成功,可是再寫出這個表達式,我們要測試某些特殊情況是否不在我們的匹配范圍內(nèi),于是我發(fā)現(xiàn)了以下兩個比較重要的問題。

第一種:

合法ip地址匹配錯誤

第二種:

非法ip地址匹配成功

為什么會出現(xiàn)上面的情況?

當(dāng)我們覺得表達式很完美的時候,雖然256超出匹配范圍,但是因為(\d{1,2}\.)的影響,使得我們的非法表達式也匹配成功,本來192.11.23.200為合法表達式,卻只匹配到了98.11.23.200,請大家看我用紅色箭頭標(biāo)注的地方,會不會跟我們子表達式的順序有關(guān)呢?那好,我來改變一下順序,我們將(\d{1,2}\.)放到了最后,防止出現(xiàn)錯誤匹配
改變匹配順序后的表達式為:

( ( (2[0-5]{2}.)|(1\d{2}.)|(\d{1,2}.)){3}((1\d{2})|(2[0-5]{2})|(\d{1,2})))

果然,第一種情況我們是因為子表達式順序的原因,導(dǎo)致匹配錯誤。

可是第二種情況使用改變順序的表達式,依然會出現(xiàn)以上問題(這里也就印證了上文提到的那些話,要想寫出一個符合規(guī)范的表達式就很困難)。

于是這里的^就起到了作用,我們可以把第一個子表達式單另拉出來加上^表示第一段ip地址開頭為(\d{1,2}),這樣剛好避免了我們?nèi)缟系那闆r,效果如下:

可以看到非法ip不在我們的匹配當(dāng)中。

其實寫到這里大家是不是感覺已經(jīng)大功告成了?回答:No

(2[0-5]{2})這個表達式能否匹配239這個ip呢?不知道有沒有細(xì)心的小伙伴發(fā)現(xiàn)

所以最終正確的表達式應(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})))

在這里可以跟大家說一下,是否可以使用$來避免我們上述第一種問題,有興趣的可以嘗試一下,到這里,我們這道題目也算基本符合規(guī)范的完成了

總結(jié)

到此這篇關(guān)于正則表達式匹配ip地址的文章就介紹到這了,更多相關(guān)正則表達式匹配ip地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論