正则表达式匹配IP地址+通配符

6

我正在尝试使用正则表达式验证器来匹配IP地址(可能带通配符)以用于IP过滤系统。

我正在使用以下正则表达式:

"([0-9]{1,3}\\.|\\*\\.){3}([0-9]{1,3}|\\*){1}"

当在LINQPad中使用Regex.Matches运行它时,它可以正常工作,但在使用验证器时似乎无法正常工作。

有人有更好的正则表达式建议或者为什么测试可以但实际应用不能的建议吗?

谢谢,Ed


您能提供一些测试案例,以便我们找出它匹配不上的原因吗? - VeeArr
@VeeArr 我还没有成功地进行验证,所以任何字符串都可以,包括IP地址:D - Ed James
5个回答

4
这个:\\.|\\*\\. 看起来有点可疑。请改为以下内容:
@"^(([0-9]{1,3}|\*)\.){3}([0-9]{1,3}|\*)$"

同时只接受0-255之间的数字(感谢apoorv020):

^((([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5])|\*)\.){3}(([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5])|\*)$

另一个好建议,但恐怕那也不起作用! - Ed James
它可以 - 在http://gskinner.com/RegExr/上尝试。确保字符串前面有一个`@`。如果仍然无法工作,请向我们展示您用于匹配它的代码。请注意,我正在尝试将其与类似`192.168.*.*和`10.*.*.*`的内容进行匹配 - 这是您想要的吗?您能向我们展示一些测试用例吗? - Callum Rogers
我认为你没有完全正确地阅读我的问题:我的原始正则表达式可以匹配带通配符的IPv4地址,但它在asp:RegularExpressionValidator中无法工作。你的正则表达式也有完全相同的问题。 - Ed James
你有尝试过使用正常的反斜杠\替换转义的反斜杠\\来测试你原本编写的正则表达式吗?(不使用C#的@转义字符)例如:尝试以下正则表达式^(([0-9]{1,3}|\*)\.){3}([0-9]{1,3}|\*)$或者(([0-9]{1,3}|\*)\.){3}([0-9]{1,3}|\*) - VeeArr
@VeeArr 我们有一个赢家。总是忘记在正则表达式验证器中不必转义!干杯,你应该把它作为一个单独的答案,这样我就可以接受它了。 - Ed James

3

asp:RegularExpressionValidator 不需要您对反斜杠进行双重转义。您可以尝试使用以下内容:

([0-9]{1,3}\.|\*\.){3}([0-9]{1,3}|\*){1}


2

[0-9]{1,3}将允许形式为999.999.999.999的IP地址。您的IP地址范围应仅允许0-255。
请将所有[0-9]{1,3}的出现替换为([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[0-5])
对我来说,这似乎非常复杂,可能有更好的方法来实现这一点,但乍一看似乎是正确的。


1
我并不是特别关心实际的IP地址是否有效,只关心格式(这样后面解析起来更容易),但是你说得对。 - Ed James

1
把起始和结束的字符串字符放到表达式里怎么样?
^([0-9]{1,3}\\.|\\*\\.){3}([0-9]{1,3}|\\*){1}$

不错的建议,但恐怕仍然无法验证! - Ed James

0

我的回答是针对.NET的一般性问题,而不是特定于RegularExpressionValidator的。

用于IP匹配的正则表达式字符串(使用ExplicitCapture避免无用捕获并保持RE简洁):

"\\b0*(2(5[0-5]|[0-4]\\d)|1?\\d{1,2})(\\.0*(2(5[0-5]|[0-4]\\d)|1?\\d{1,2})){3}\\b"

根据特定的用例,您可能希望在开头添加适当的锚点,即\A^,并在结尾处添加\Z$。然后,您可以删除单词边界要求:\b
(记得在字符串内部加倍使用\

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接