如何使regex匹配全部或不匹配



我想要一个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

我想不出如何将它们组合起来以匹配全部或没有。我尝试使用重复和分组,它要么没有改变匹配的内容,要么完全破坏了RegEx

在图案周围设置文字边界。

另外,您的端口号模式中有一个错误。[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

最新更新