使用regex测试ip地址

时间:2017-09-14 14:54:16

标签: javascript 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。有谁可以指出我在这里做错了什么?

2 个答案:

答案 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])|$)$

Test it here

正则表达式应检查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)

中的块

Test it here

答案 1 :(得分:1)

您必须在将正则表达式从在线正则表达式测试程序粘贴到JS代码时遇到问题。但是,这里存在一些问题:1)您\/\/要求//出现在字符串中,2)您将^锚点添加到模式的末尾(并且因为它需要字符串位置的开始,它阻止你的正则表达式匹配)。此外,不需要gi修饰符,您只需针对其中没有字母的模式测试整个字符串。

使用

/^(?: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]?) - 一个八位字节模式,0255
  • (?:\.(?: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]) - 一个可选的12后跟任意数字(029,与[12]?\d匹配)或{ {1}}后跟30230
  • 的数字
  • 32 - 字符串结束。
相关问题