匹配 IP 地址

IPv4

要匹配 IPv4 地址格式,你需要檢查數字 [0-9]{1,3} 三次 {3} 由句子\. 分隔並以另一個號碼結尾。

^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$

這個正規表示式太簡單 - 如果你想要它準確,你需要檢查數字是在 0255 之間,正規表示式在上面接受任何位置的 444。你想要使用 25[0-5] 或任何其他 200 值 2[0-4][0-9] 或任何 100 或更少值的 [01]?[0-9][0-9] 來檢查 250-255。你想檢查一下\. 然後是三次 {3} 然後一次沒有一段時間。

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

IPv6

IPv6 地址採用以冒號(:)字元分隔的 8 個 16 位十六進位制字的形式。在這種情況下,我們檢查 7 個單詞後跟冒號,然後檢查不是冒號。如果一個單詞具有前導零,則它們可能被截斷,這意味著每個單詞可能包含 1 到 4 個十六進位制數字。

^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$

然而,這是不夠的。由於 IPv6 地址可能變得非常羅嗦,因此該標準規定只有零字可以被::取代。這可能只在地址中進行一次(對於 1 到 7 個連續單詞之間的任何地方),否則它將是不確定的。這產生了許多(相當討厭的)變化:

^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:)?[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$

現在,把它們放在一起(使用交替)產生:

^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:)?[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$

一定要以多行模式寫出來並附上一堆評論,這樣任何人都不可避免地要弄清楚這意味著什麼並不是在你用一個鈍器之後。