[英]Testing an ip address with regex
我正在嘗試測試以下IP地址字符串的有效性,例如:
1.1.1.1/8
15.10.30.100/16
100.10.10.44/24
198.30.20.30/32
並且我有以下正則表達式,用於測試IP的每個項目:
!/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]\/\/(/^\d+)/ig?)$/.test(item.trim())
但是我不確定在帶有正斜杠后跟數字的部分,例如/24
, /32
...就是\\/\\/(/^\\d+)/ig
。 有人可以指出我在這里做錯了什么嗎?
我沒有檢查您的正則表達式中的錯誤,但我在這里工作
(?:(?:25[0-5]|[0-2]?[0-4]?[0-9]|[0-1]?[0-9]?[0-9])\.){3}(?:(?:25[0-5]|[0-2]?[0-4]?[0-9]|[0-1]?[0-9]?[0-9]))(?:\/(?:3[0-2]|[1-2]?[0-9])|$)$
正則表達式應檢查從0到32的分配塊以及沒有IP4的分配塊。
如果要檢查特定的分配塊,則應使用此分配塊
(?:(?:25[0-5]|[0-2]?[0-4]?[0-9]|[0-1]?[0-9]?[0-9])\.){3}(?:(?:25[0-5]|[0-2]?[0-4]?[0-9]|[0-1]?[0-9]?[0-9]))(?:\/(?:8|16|24|32)|$)
和最后一個嵌套的非捕獲組內的過濾塊(?:8|16|24|32)
您可能在將正則表達式從在線正則表達式測試器粘貼到JS代碼時遇到了麻煩。 但是,這里存在一些問題:1)您有\\/\\/
要求//
出現在字符串中,2)在模式的結尾附近添加了^
錨(並且由於它需要字符串位置的開始,所以它阻止您的正則表達式匹配)。 此外,不需要g
和i
修飾符,只需針對其中沒有字母的模式測試整個字符串。
采用
/^(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}\/(?:[12]?\d|3[0-2])$/
參見regex演示 。
在JS中,您可以動態構建模式以提高可讀性:
var octet = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"; var rx = new RegExp("^" + octet + "(?:\\\\." + octet + "){3}/(?:[12]?\\\\d|3[0-2])$"); var strs = [ "1.1.1.1/8", "15.10.30.100/16", "100.10.10.44/24", "198.30.20.30/32", "1.1.1.1/0", "1.1.1.1/32", "1.1.1.1/33"]; for (var s of strs) { console.log(s, "=>", rx.test(s)); }
圖案細節
^
-字符串的開頭 (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
-八位位組模式, 0
到255
(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}
-3次的:
\\.
-一個點 (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
-八位位組模式 \\/
-斜線 (?:[12]?\\d|3[0-2])
-可選1
或2
后跟任意數字( 0
到29
,與[12]?\\d
匹配),或3
后跟從0
到數字2
( 30
至32
) $
-字符串結尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.