詳解乙個自己原創的正則匹配IP的表示式

2022-03-07 02:31:15 字數 4870 閱讀 4357

這裡給大家詳細講解一下乙個匹配ip位址的正規表示式,

有關正則方面的知識,會在詳細的講解中提到。

ip位址,是由

32位數字二進位制轉為四個十進位制的字串組成。

怎麼轉化?下面講解:

二進位制:11111111111111111111111111111111

分為四部分:11111111.11111111.11111111.11111111

轉化:2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=255

轉為十進位制範圍:0~255.0~255.0~255.0~255

這就是ip位址的範圍。

根據這個生成ip的規則和範圍,我們可以用正規表示式來匹配出ip位址,但怎麼匹配呢?各人有各人的方法,這裡我講解一下我的思路。

根據ip位址的字串規律,我把匹配

ip位址的表示式分為兩部分來考慮。

第一部分:匹配3個

0~255.

(注意後面的乙個點)

第二部分:匹配最後的數字0~255

也就是說,先匹配出 0~255.(注意後面的乙個點) 這個字串,然後重複匹配

3次,然後再匹配最後的數字部分

0~255

。這就是我匹配

ip位址的思路。

首先,我要提一下,正則是沒有辦法做數字運算的,所以,我們無法用數字運算的方式篩選出ip的數字範圍。既然沒法用數字運算的方式篩選出

ip的數字範圍,那麼我們應該用什麼其他方式來篩選這個數字範圍呢?我的思路是分組討論,然後再把這些分組合併起來組成

ip的數字範圍。

①、假設ip

的數字是百位數,那麼根據

ip的數字範圍,我們可以得出下面幾種情況。假設第乙個數字為

1,那麼這個數字的範圍就為

1[0-9][0-9]

。這個應該不難理解,就不解釋。

②、假設第乙個數字為2

,那麼根據

ip數字的範圍規則,這裡又要分為兩種情況,為什麼?你想想,最大數字是

255,當十位數為

5時,個位數最大只能為

5是吧?而當十位數為0到

4時,個位數可以是任意數字對吧?

所以,這裡的兩種情況分別為:

a、2[0-4][0-9]

b、25[0-5]

③、分析完了百位數的情況,接下來就是十位數的情況了,假如是十位數,那麼十位數的前面第乙個數不能為零是吧?

所以十位數的情況可以是:[1-9][0-9]

④、剩下的就是個位數的情況了,個位數的情況,大家應該很容易得出結論,就是:[0-9]

。四種情況分析下來,我們得出了ip數字的範圍分組為:

1[0-9][0-9]

2[0-4][0-9]

25[0-5]

[1-9][0-9]

[0-9]

怎麼把上面的分組用正規表示式表示出來呢?很簡單,用正則的或符號|和分組符號

()就可以了,所以上面的分組正規表示式為:

(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])

寫到這裡,數字的匹配範圍正規表示式已經寫好了,那麼根據我前面的思路:

第一部分:匹配3個

0~255.

(注意後面的乙個點)

第二部分:匹配最後的數字0~255

我們來匹配ip位址的第一部分,正規表示式如下:

(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)

我在每個數字的後面加了乙個點就是匹配出0~255.(注意後面的乙個點)

那麼怎麼重複匹配三次呢?很簡單,我們只要把這五個分組當成整體,再重複匹配三次就行了,正規表示式如下:

((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9])\.))

第一部分已經匹配出來了,接下來就是拼接上第二部分的數字了,數字部分上面已經寫得很清楚了,就不再解釋了,下面是完整的正規表示式:

((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.))((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))

寫到這裡,正則匹配ip的表示式已經出來了,不過,這並不是最終的匹配

ip的正規表示式,為什麼呢?很簡單,正規表示式會對每乙個分組都進行捕獲匹配,上面把匹配

ip分成了那麼多分組,而每乙個分組的內容都會被正則所捕獲,那上面不知道已經捕獲多少

ip了,呵呵,那麼怎麼去掉分組的內容呢?很簡單,用這個符號

?:?:符號放在

()圓括號裡面,是捕獲分組,但不捕獲正規表示式的內容的意思。那麼,我們把它放到每乙個分組裡面去,不就去掉了分組的內容了嗎?所以,我們還要給每個分組加上

?:,加上後正則如下:

(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.))(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))

即使到這裡,還是沒有把ip位址匹配出來,我們還要用^和

$來限制字串的開頭和結尾,所以,最後的匹配

ip^(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.))(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))$

這就是我匹配ip位址最完整的正規表示式,大家可以借鑑一下,有什麼

bug還望讀者提出,免得誤導其他讀者。

上面的正規表示式的()括號都是成對出現的,假如有不成對出現,請讀者自己新增一下,可能是我漏寫了。

下面是我的測試:

<?php

$pattern = '/^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.))(?:(?:2[0-5][0-5])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$/';

//正則匹配ip位址

$ip = '254.21.0.198';

preg_match($pattern,$ip,$out

);echo '';

print_r($out

);$ip = '255.777.0.198';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '07.25.8.198';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '1207.25.8.198';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = 'qq107.25.8.198';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '\.\.\.107.25.8.198';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '\.\.\. 7.25.8.198';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '107.25.8.19822vvv';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '107.25.r8.1982';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '107.225.8.19';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '225.225.225.225';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '0.0.0.0';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '00.0.0.0';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '0.202.1.0';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '0.202.1.226';

preg_match($pattern,$ip,$out

);print_r($out

);$ip = '249.202.1.0';

preg_match($pattern,$ip,$out

);print_r($out

);$s='';

for($i=0;$i

<32;$i++)

echo$s;

echo

strlen($s);

原創 乙個XSL的例子

一直耳聞xsl,可是一直沒有使用過,這次由於專案的需要,只好用心好好研究一下,成果如下 首先,要糾正一下,xsl並不是一種程式語言,它只是一種用來轉換xml的語言,這個有點類似我們的spring的配置檔案,是通過對xml語言的解析,來達到我們需要的目的,下面的例子,可以幫助你更好的理解這一點。環境,...

lua正則匹配 只匹配第乙個 正規表示式匹配

難度 困難 給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字...

C 正則基礎 d 匹配乙個數字

using system using system.text.regularexpressions namespace for int i 0 i contents.length i else console.readkey a不成功 1234成功 a3bb33345成功 不成功 感恩曾經幫助過 心...