正则表达式验证最后一位为非零的ip地址

时间:2019-02-04 06:47:15

标签: javascript regex angular angular-forms

我有一个正则表达式,我最终使用了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无效

4 个答案:

答案 0 :(得分:1)

假设最后一部分不能写Caused by: java.sql.SQLException: Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property. 000,而只能写00。那你可以这样的正则表达式

0

其中第一组和最后一组之间的差异是1到9之间的差异

demo

答案 1 :(得分:1)

您要避免将最后一个八位位组设置为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(?:\/|$))模式是前瞻,如果在当前位置(字符串开头)的右侧紧接有以下内容,则匹配失败:

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

通知我使用 regex文字符号/regex/定义了模式,我不得不添加^(字符串开头)和$(字符串结尾) )作为锚,因为正则表达式默认不再锚定。另外,要以正则表达式文字符号转义特殊字符,您只需要一个反斜杠,而不是两个。

答案 2 :(得分:0)

您可以尝试使用此模式

Text( "This is a sample text", textAlign: TextAlign.center, style: TextStyle( color: Color.fromRGBO(255, 179, 102, 1) ) )

在线demo

您可以查看的最后一个数字

^(?:[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])$

答案 3 :(得分:0)

这里一种可能的方法很简单,只需要在模式(?<!\.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引擎可能尚未支持否定的后向语法。