參考鏈接:
https://blogs.msdn.microsoft.com/oldnewthing/20060522-08/?p=31113
http://www.cnblogs.com/txw1958/archive/2011/10/13/2210114.html
自己總結下:
(1) 正則表達式表示
首先,需要了解IP地址的基本格式。
IP地址的長度是32位,點分十進制表示分為4段,每段的范圍是0~255. 例如:113.225.167.23 考慮每段的情況 有效的數字可以分為以下幾種
1、一位數字 (0~9)
2、兩位數字 (10~99)
3、三位數字
(1) “1” 開頭 (100~199)
(2) "2"開頭 (200~249 250~255)
對應正則表達式匹配如下:
數值范圍 正則表達式匹配
0~9 \d
10~99 [1-9]\d
100~199 1\d\d
200~249 2[0-4]\d
250~255 25[0-5]
整合下:
/^\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]$/
由於任何以非零數字開頭的數字 是有效的 上述表達式中頭2部分可以合並
/^[1-9]?\d|1\d\d|2[0-4]\d|25[0-5]$/
那么可以得出完整的IPV4表示方法了
/^([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$/
這種 表示方法可能並不准確。因為有些解析器會接收前導0,比如解析127.0.0.001和127.0.0.1是一樣的。而有的解析器會把前導0當做8進制前綴
更改下上述表達式:
/^0*([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.0*([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.0*([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.0*([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$/
當再次看到這表達式分析時,可能需要很久才能明白它的意思。
正則表達式擅長的是文本匹配,並不會進行數學運算。
更好的一種實現方式是使用JS代碼來實現
function isDottedIPv4(s) { var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); return match != null && match[1] <= 255 && match[2] <= 255 && match[3] <= 255 && match[4] <= 255; }