2017-08-03 119 views
1

我正在嘗試創建一個匹配非格式化爲:ip | port的正則表達式。
端口值可以在[1 65535]之間。組數據的正則表達式 - 與IOC IP的行尾不匹配| PORT

實例:
(1)8.8.8.8 | 0(不良:端口0不允許)
(2)8.8.8.8 | 1(好)
(3)8.8。 8.8 | 65536(壞:端口> 65535)
(4)8.8.8.8 | dawda(壞:炭)

正則表達式表達(符合壞數據)應該匹配(1),(3)和(4) 。

認爲IP部分將永遠是正確的(無需正則表達式吧)和我需要的是檢查的端口。正因爲如此,通過我這樣的行的端部開始的評價:

正則表達式匹配0和65535之間的端口:
\ | 6553 [0-5](| 655 0-2 [ ] \ d | 65 [0-4] \ d {2} | 6 [0-4] \ d {3} | [1-5] \ d {4} | [1-9] \ d {0,3 })

Regex with end of line matching:
\ |(6553 [0-5] | 655 [0-2] \ d | 65 [0-4] \ d {2} | 6 [0-4] \ d {3} | [1-5] \ d {4} | [1-9] \ d {0,3})$

現在,我想否定它,以避免linent端口有效的端口。我看看其他論壇(How to negate specific word in regex?,Regular Expressions and negating a whole character group),並瞭解負面預測正則表達式。

根據這些論壇和排除模式正則表達式,我的正則表達式應爲:

^* $

我修改了我的正則表達式,並添加*的IP部分((MY_REGEX)?!)。插入^。

Negative regex at end of line:?!
^(\ |(6553 [0-5] | 655 [0-2] \ d | 65 [0-4] \ d {2} | 6 [0-4 ] \ d {3} | [1-5] \ d {4} | [1-9] \ d {0,3}))。 $

我遇到的問題是結尾部分。* $,它允許端口號之後的東西。最後,此代碼將以PHP執行。根據PHP,不支持可變長度後視,這使我首先選擇lookahead正則表達式。

感謝您的幫助。

+2

我會推薦使用簡單的正則表達式進行基本的語法驗證,並在'|'後面的數字上使用捕獲組。然後在你的代碼中使用一種方法來驗證數字的範圍。正則表達式不會很好。 – CAustin

回答

1

最合適的方法是通過|(.*)(任何0+比換行符字符等字符)捕獲部分和與位的PHP代碼驗證它:如果

if (preg_match('~^\d+(?:\.\d+){3}\|(.*)$~', $s, $res)) { 
    if (ctype_digit($res[1]) && intval($res[1]) > 0 && intval($res[1]) < 65536) { // valid port, omit 
     echo "The port is valid: " . $res[1]; 
    } else { 
     echo "Invalid port: " . $res[1]; 
    } 
} 

ctype_digit的檢查字符串只包含數字。

查看online PHP demo

如果你只需要這將是PCRE兼容模式,可以使用以下模式:

^\d+(?:\.\d+){3}\|(?!(?:[1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$)(.*)$ 

regex demo

請參見下面的詳細信息:

  • ^ - 字符串開頭
  • \d+ - 1+位數
  • (?:\.\d+){3} - 接着用1個+數字的.的3序列(即無需驗證的IP模式,你認爲這是預先驗證)
  • \| - 字面|
  • (?!(?:[1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$) - 負先行將失敗匹配,如果它發現以下數值在字符串的末尾:
    • [1-9]\d{0,3} - 從19一個數字,然後0至3位數(19999
    • [1-5]\d{4} - 從15一個數字,然後4個數字(1000059999
    • 6[0-4]\d{3} - 6,從04,然後3位數字(6000064999
    • 65[0-4]\d{2}一個數字 - 65,數字從04,和2位(6500065499
    • 655[0-2]\d - 655,從01的一個數字到2,和1位(6550065529
    • 6553[0-5] - 6553065535
  • (.*) - 捕獲不是一個有效的端口,任何0+字符(比換行符字符等)到串
  • $的端部分 - 字符串的結尾。