我试图测试以下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
。有谁可以指出我在这里做错了什么?
答案 0 :(得分:2)
我没有检查你的正则表达式中的错误,但我在这里工作了
(?:(?: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)
答案 1 :(得分:1)
您必须在将正则表达式从在线正则表达式测试程序粘贴到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 demo。
在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
匹配)或{ {1}}后跟3
到0
(2
到30
)32
- 字符串结束。