主頁 > 知識庫 > 正則表達(dá)式匹配IP的表達(dá)式(推薦)

正則表達(dá)式匹配IP的表達(dá)式(推薦)

熱門標(biāo)簽:外呼系統(tǒng)無呼出路由是什么原因 地圖標(biāo)注教學(xué)點(diǎn) 梅縣地圖標(biāo)注 西藏智能外呼系統(tǒng)代理商 貴港公司如何申請400電話 呼叫系統(tǒng)外呼只能兩次 ai電話機(jī)器人搭建 400電話辦理電話辦理 甘肅醫(yī)療外呼系統(tǒng)排名

這里給大家詳細(xì)講解一下一個匹配IP地址的正則表達(dá)式,

  有關(guān)正則方面的知識,會在詳細(xì)的講解中提到。

  在講解之前,我先給大家介紹一下,ip地址的生成規(guī)則。

  IP地址,是由32位數(shù)字二進(jìn)制轉(zhuǎn)為四個十進(jìn)制的字符串組成。

  怎么轉(zhuǎn)化?下面講解:

      二進(jìn)制:11111111111111111111111111111111

      分為四部分:11111111.11111111.11111111.11111111

      轉(zhuǎn)化:2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=255

      轉(zhuǎn)為十進(jìn)制范圍:0~255.0~255.0~255.0~255

      這就是IP地址的范圍。

      根據(jù)這個生成IP的規(guī)則和范圍,我們可以用正則表達(dá)式來匹配出IP地址,但怎么匹配呢?各人有各人的方法,這里我講解一下我的思路。

      根據(jù)IP地址的字符串規(guī)律,我把匹配IP地址的表達(dá)式分為兩部分來考慮。

      第一部分:匹配3個0~255.(注意后面的一個點(diǎn))

      第二部分:匹配最后的數(shù)字0~255

      也就是說,先匹配出 0~255.(注意后面的一個點(diǎn)) 這個字符串,然后重復(fù)匹配3次,然后再匹配最后的數(shù)字部分0~255。這就是我匹配IP地址的思路。

       首先,我要提一下,正則是沒有辦法做數(shù)字運(yùn)算的,所以,我們無法用數(shù)字運(yùn)算的方式篩選出IP的數(shù)字范圍。既然沒法用數(shù)字運(yùn)算的方式篩選出IP的數(shù)字范圍,那么我們應(yīng)該用什么其他方式來篩選這個數(shù)字范圍呢?我的思路是分組討論,然后再把這些分組合并起來組成IP的數(shù)字范圍。

       ①、假設(shè)IP的數(shù)字是百位數(shù),那么根據(jù)IP的數(shù)字范圍,我們可以得出下面幾種情況。假設(shè)第一個數(shù)字為1,那么這個數(shù)字的范圍就為1[0-9][0-9]。這個應(yīng)該不難理解,就不解釋。

      ②、假設(shè)第一個數(shù)字為2,那么根據(jù)IP數(shù)字的范圍規(guī)則,這里又要分為兩種情況,為什么?你想想,最大數(shù)字是255,當(dāng)十位數(shù)為5時,個位數(shù)最大只能為5是吧?而當(dāng)十位數(shù)為0到4時,個位數(shù)可以是任意數(shù)字對吧?

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

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

           B、25[0-5]

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

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

       ④、剩下的就是個位數(shù)的情況了,個位數(shù)的情況,大家應(yīng)該很容易得出結(jié)論,就是:[0-9]。

       四種情況分析下來,我們得出了IP數(shù)字的范圍分組為:

        1[0-9][0-9]

        2[0-4][0-9]

        25[0-5]

        [1-9][0-9]

        [0-9]

       怎么把上面的分組用正則表達(dá)式表示出來呢?很簡單,用正則的或符號|和分組符號()就可以了,所以上面的分組正則表達(dá)式為:

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

        寫到這里,數(shù)字的匹配范圍正則表達(dá)式已經(jīng)寫好了,那么根據(jù)我前面的思路: 第一部分:匹配3個0~255.(注意后面的一個點(diǎn))

         第二部分:匹配最后的數(shù)字0~255

        我們來匹配IP地址的第一部分,正則表達(dá)式如下: 

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

   我在每個數(shù)字的后面加了一個點(diǎn)就是匹配出0~255.(注意后面的一個點(diǎn))

         那么怎么重復(fù)匹配三次呢?很簡單,我們只要把這五個分組當(dāng)成整體,再重復(fù)匹配三次就行了,正則表達(dá)式如下: 

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

         第一部分已經(jīng)匹配出來了,接下來就是拼接上第二部分的數(shù)字了,數(shù)字部分上面已經(jīng)寫得很清楚了,就不再解釋了,下面是完整的正則表達(dá)式:

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

      寫到這里,正則匹配IP的表達(dá)式已經(jīng)出來了,不過,這并不是最終的匹配IP的正則表達(dá)式,為什么呢?很簡單,正則表達(dá)式會對每一個分組都進(jìn)行捕獲匹配,上面把匹配IP分成了那么多分組,而每一個分組的內(nèi)容都會被正則所捕獲,那上面不知道已經(jīng)捕獲多少IP了,呵呵,那么怎么去掉分組的內(nèi)容呢?很簡單,用這個符號?:

      ?:符號放在()圓括號里面,是捕獲分組,但不捕獲正則表達(dá)式的內(nèi)容的意思。那么,我們把它放到每一個分組里面去,不就去掉了分組的內(nèi)容了嗎?所以,我們還要給每個分組加上?:,加上后正則如下:

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

    即使到這里,還是沒有把IP地址匹配出來,我們還要用^和$來限制字符串的開頭和結(jié)尾,所以,最后的匹配IP地址的正則表達(dá)式是:

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

    這就是我匹配IP地址最完整的正則表達(dá)式,大家可以借鑒一下,有什么bug還望讀者提出,免得誤導(dǎo)其他讀者。

    上面的正則表達(dá)式的()括號都是成對出現(xiàn)的,假如有不成對出現(xiàn),請讀者自己添加一下,可能是我漏寫了。

    下面是我的測試:

?php
$pattern = '/^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?: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 'pre>';
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;$i32;$i++){
  $s .= '1';
}
echo $s;
echo strlen($s);

您可能感興趣的文章:
  • Python使用中文正則表達(dá)式匹配指定中文字符串的方法示例
  • iOS 正則表達(dá)式判斷純數(shù)字及匹配11位手機(jī)號碼的方法
  • Go語言正則表達(dá)式用法實(shí)例小結(jié)【查找、匹配、替換等】
  • 正則表達(dá)式教程之重復(fù)匹配詳解
  • 正則表達(dá)式m修飾符(多行匹配)
  • 正則表達(dá)式全局匹配模式(g修飾符)
  • Java使用正則表達(dá)式(regex)匹配中文實(shí)例代碼
  • 正則表達(dá)式匹配(URL、電話、手機(jī)、郵箱)的實(shí)例代碼

標(biāo)簽:本溪 大興安嶺 涼山 常州 哈密 湖州 泰安 巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《正則表達(dá)式匹配IP的表達(dá)式(推薦)》,本文關(guān)鍵詞  正則,表達(dá)式,匹配,的,推薦,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。

  • 相關(guān)文章
  • 下面列出與本文章《正則表達(dá)式匹配IP的表達(dá)式(推薦)》相關(guān)的同類信息!
  • 本頁收集關(guān)于正則表達(dá)式匹配IP的表達(dá)式(推薦)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章