[英]How do make regex match all or nothing
我希望 RegEx 匹配组成有效 IP、冒号和端口的字符串。 如果该字符串包含有效的 IP 和无效的端口号,反之亦然,我希望它完全不匹配。 我正在 C# 应用程序中实现它。
为此,我正在尝试整合如何查找或验证 IP 地址中的以下内容
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))
这些中的每一个都独立工作以匹配 IP 地址和端口号就好了。
我把它们结合起来
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\:((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))
结果是,例如:
256.250.139.193:1234 // bad IP, good port. The RegEx matches "56.250.139.193:1234". Fail. I want it to match nothing
1.1.1.1:65535 // good IP, good port #. The RegEx matches "1.1.1.1:65535". Pass. This is what I want it to do
1.1.1.1:65536 // good IP, bad port, matches "1.1.1.1:". Fail. I want it to match nothing
我无法弄清楚如何将它们组合起来以匹配全部或不匹配。 我尝试使用重复和分组,它要么没有改变匹配的内容,要么完全破坏了正则表达式
在模式周围放置单词边界。
此外,您的端口号模式有误。 [0-5]{0,5}
应该是[0-5]{1,5}
,否则匹配空端口号。
\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{1,5})|([0-9]{1,4}))\b
一种可靠且可读的方式,使用特定的 Perl 解析器Regexp::Common :
perl -MRegexp::Common -lne '
my ($ip, $port) = /^($RE{net}{IPv4}):(\d+)$/;
print "$ip:$port" if defined $ip and defined $port and $port < 65536
' file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.