Javascript 使用regex测试ip地址

Javascript 使用regex测试ip地址,javascript,regex,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]|

我正在尝试测试以下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)


我没有检查您的正则表达式中的错误,但我这里有一个有效的

(?:(?: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
修饰符,您只需针对其中没有字母的模式测试整个字符串

使用

在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/32”、“1.1.1/33”];
用于(STR的var s){
控制台日志,“=>”,接收测试);

}
将正则表达式从在线正则表达式测试仪粘贴到JS代码时一定遇到了问题。但是,这里有一些问题:1)您有
\/\/
要求
/
出现在字符串中,2)您在模式末尾附近添加了
^
锚点(由于它需要字符串位置的开始,因此无法匹配正则表达式)。此外,不需要
g
i
修饰符,您只需针对其中没有字母的模式测试整个字符串

使用

在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/32”、“1.1.1/33”];
用于(STR的var s){
控制台日志,“=>”,接收测试);

}
除了斜线,读
[01]?[0-9][0-9]?
的部分将匹配以0开头的两位数和三位数,如
000
——不确定您是否需要。除了斜线,读
[01]?[0-9][0-9]的部分?
将匹配以0开头的两位和三位数字,如
000
——不确定是否需要。非捕获组是
(?:…)
,而不是
(:?…)
,这意味着捕获组以可选的
(?:3[0-2]|[1-2][0-9]|[0-9])开头。
可以缩短为
(?:3[0-2]|[1-2]|[0-9])
@WillBarnwell,是的,我曾经有过这样的想法,但在测试某些东西时改变了它;谢谢你告诉我。非捕获组是
(?:…)
,而不是
(:?…)
,这意味着捕获组以可选的
(?:3[0-2]|[1-2][0-9]|[0-9])开头。可以缩短为
(?:3[0-2]|[1-2]?[0-9])
。@WillBarnwell,是的,我曾经有过,但在测试某些东西时对它做了修改;谢谢你告诉我。子网掩码不能超过32。@Toto如果你是说
/
后面的数字可以从
1
32
\\d+
必须替换为
(?:[1-9]|[12]\\d |[3[0-2])
。实际上应该切换到
(?:[12]?\\d | 3[0-2])
<代码>/0到
/32
是CIDR中的有效子网掩码notation@WillBarnwell谢谢你的更正。我在答案中添加了更多的测试用例和解释。子网掩码不能超过32。@Toto如果你是说
/
后面的数字可以从
1
32
\\d+
必须替换为
(?:[1-9]|[12]\\d | 3[0-2])
。它实际上应该切换到
(?:[12]?:[12]| 3[0-2])
<代码>/0到
/32
是CIDR中的有效子网掩码notation@WillBarnwell谢谢你的更正。我在答案中添加了更多的测试用例和解释。