我有一个正则表达式,我最终使用了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无效
答案 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之间的差异
答案 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)$
缺点是您的JavaScript引擎可能尚未支持否定的后向语法。