正则表达式验证最后一位非零的 ip 地址
Regexp to validate ip address with last digit as non zero
我有一个正则表达式,我最终使用了 SO 中的一个答案。
基本上我的正则表达式必须使用 mask 验证 ipv4 地址。
所以我最终使用了以下正则表达式:
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))
现在我的挑战是不允许 ip 的最后一位数字为 0,即,
192.168.6.10/mask
有效但 192.168.6.0/mask
无效
所以我将上面的正则表达式修改成这样:
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[1-9]?)/([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))
但是 192.168.6.0
在使用 Angular Validators.pattern
进行测试时始终有效
知道我哪里出错了吗?
编辑
IP 列表及其有效性:
192.168.6.6/24 有效
192.168.6.6/24 有效
192.168.6.24/24 有效
192.168.6.0/24无效
192.168.6.0/255.255.255.0 无效
你可以试试这个模式
^(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:2[0-5][1-5]|[1-9]|1[0-9][1-9]|[1-9][1-9])$
在线demo
关于您检查过的最后一个数字
(?:2[0-5][1-5]|[1-9]|1[0-9][1-9]|[1-9][1-9])
一种可能的方法很简单,只需要在模式 (?<!\.0)
的末尾添加一个负向后视,断言 .0
不是 IP 地址中紧接在前的术语.从上面的评论中将其应用于您的正确工作模式,我们得到:
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/
([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|
(255\.(0|128|192|224|240|248|252|254)\.0\.0)|
(255\.255\.(0|128|192|224|240|248|252|254)\.0)|
(255\.255\.255\.(0|128|192|224|240|248|252|254))))(?<!\.0)$
缺点是您的 JavaScript 引擎可能还不支持负向回顾语法。
假设最后一部分不能写000
和00
而只能写0
。那你可以这样的正则表达式
^(?:(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)\.){3}(?:(?:2(?:5[0-5]|[0-4]\d)|1?\d\d|[1-9]))$
第一组和最后一组之间的差异,一个数字值应该是从 1 到 9
您想避免匹配最后一个八位字节设置为 0
的任何 IP。
您可以使用
ipAddress : FormControl = new FormControl('' , Validators.pattern(/^(?!(?:\d+\.){3}0(?:\/|$))(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:[1-9]|1[0-9]|2[0-9]|3[0-2]|(?:(?:128|192|224|240|248|252|254)\.0\.0\.0|255\.(?:0|128|192|224|240|248|252|254)\.0\.0|255\.255\.(?:0|128|192|224|240|248|252|254)\.0|255\.255\.255\.(?:0|128|192|224|240|248|252|254)))$/));
主要添加的是 ^
之后的前瞻,它在字符串的开头执行一次。 (?!(?:\d+\.){3}0(?:\/|$))
模式是一个 negative 前瞻,如果在当前位置(字符串开始)的右侧有:
,则匹配失败
(?:\d+\.){3}
- 三个重复的 1+ 数字和一个点
0
- 零
(?:\/|$))
- /
或 (|
) 字符串结尾 ($
).
注意我使用 正则表达式文字符号 (/regex/
) 定义了模式,我必须添加 ^
(字符串开始)和 $
(字符串结尾)锚点,因为默认情况下不再锚定正则表达式。此外,要转义正则表达式文字符号中的特殊字符,您只需要一个反斜杠,而不是两个。
我有一个正则表达式,我最终使用了 SO 中的一个答案。 基本上我的正则表达式必须使用 mask 验证 ipv4 地址。
所以我最终使用了以下正则表达式:
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))
现在我的挑战是不允许 ip 的最后一位数字为 0,即,
192.168.6.10/mask
有效但 192.168.6.0/mask
无效
所以我将上面的正则表达式修改成这样:
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[1-9]?)/([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))
但是 192.168.6.0
在使用 Angular Validators.pattern
知道我哪里出错了吗?
编辑 IP 列表及其有效性:
192.168.6.6/24 有效 192.168.6.6/24 有效 192.168.6.24/24 有效
192.168.6.0/24无效 192.168.6.0/255.255.255.0 无效
你可以试试这个模式
^(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(?:2[0-5][1-5]|[1-9]|1[0-9][1-9]|[1-9][1-9])$
在线demo
关于您检查过的最后一个数字
(?:2[0-5][1-5]|[1-9]|1[0-9][1-9]|[1-9][1-9])
一种可能的方法很简单,只需要在模式 (?<!\.0)
的末尾添加一个负向后视,断言 .0
不是 IP 地址中紧接在前的术语.从上面的评论中将其应用于您的正确工作模式,我们得到:
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/
([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|
(255\.(0|128|192|224|240|248|252|254)\.0\.0)|
(255\.255\.(0|128|192|224|240|248|252|254)\.0)|
(255\.255\.255\.(0|128|192|224|240|248|252|254))))(?<!\.0)$
缺点是您的 JavaScript 引擎可能还不支持负向回顾语法。
假设最后一部分不能写000
和00
而只能写0
。那你可以这样的正则表达式
^(?:(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)\.){3}(?:(?:2(?:5[0-5]|[0-4]\d)|1?\d\d|[1-9]))$
第一组和最后一组之间的差异,一个数字值应该是从 1 到 9
您想避免匹配最后一个八位字节设置为 0
的任何 IP。
您可以使用
ipAddress : FormControl = new FormControl('' , Validators.pattern(/^(?!(?:\d+\.){3}0(?:\/|$))(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:[1-9]|1[0-9]|2[0-9]|3[0-2]|(?:(?:128|192|224|240|248|252|254)\.0\.0\.0|255\.(?:0|128|192|224|240|248|252|254)\.0\.0|255\.255\.(?:0|128|192|224|240|248|252|254)\.0|255\.255\.255\.(?:0|128|192|224|240|248|252|254)))$/));
主要添加的是 ^
之后的前瞻,它在字符串的开头执行一次。 (?!(?:\d+\.){3}0(?:\/|$))
模式是一个 negative 前瞻,如果在当前位置(字符串开始)的右侧有:
(?:\d+\.){3}
- 三个重复的 1+ 数字和一个点0
- 零(?:\/|$))
-/
或 (|
) 字符串结尾 ($
).
注意我使用 正则表达式文字符号 (/regex/
) 定义了模式,我必须添加 ^
(字符串开始)和 $
(字符串结尾)锚点,因为默认情况下不再锚定正则表达式。此外,要转义正则表达式文字符号中的特殊字符,您只需要一个反斜杠,而不是两个。