正则表达式验证最后一位非零的 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)$

Demo

缺点是您的 JavaScript 引擎可能还不支持负向回顾语法。

假设最后一部分不能写00000而只能写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

demo

您想避免匹配最后一个八位字节设置为 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)))$/));

这是regex demo

主要添加的是 ^ 之后的前瞻,它在字符串的开头执行一次。 (?!(?:\d+\.){3}0(?:\/|$)) 模式是一个 negative 前瞻,如果在当前位置(字符串开始)的右侧有:

,则匹配失败
  • (?:\d+\.){3} - 三个重复的 1+ 数字和一个点
  • 0 - 零
  • (?:\/|$)) - / 或 (|) 字符串结尾 ($).

注意我使用 正则表达式文字符号 (/regex/) 定义了模式,我必须添加 ^ (字符串开始)和 $(字符串结尾)锚点,因为默认情况下不再锚定正则表达式。此外,要转义正则表达式文字符号中的特殊字符,您只需要一个反斜杠,而不是两个。