匹配不带80端口的IP

Match IP without port 80

我想匹配端口不是 80 的所有 IP 地址。

这个正则表达式几乎可以工作:

[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(?!:80)

加上这段文字:

94.79.78.146:44732
172.31.11.22:80
https://14.194.34.176:443/
"172.31.11.22:80"

它很好地匹配了 IP 地址,除了 172.31.11.22:80 匹配 172.31.11.2 注意最后一个 2 是如何被省略的。

怎么会?我有 [0-9]+ 这是一个贪婪的消费者,它应该匹配整个数字 22

我会将您的正则表达式表述为:

[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:(?!80)[0-9]+

Demo

这与您的版本略有不同,它断言端口不是 80,方法是将否定先行 放在冒号 之后但在 [0-9]+ 之前端口号。

整个模式必须匹配,它错过最后一个数字的原因是因为 [0-9]+ 可以回溯一步,以便断言 (?!:80) 为真。

您可以通过在匹配数字的最后一个字符 class 后添加单词边界 \b 来防止回溯:

[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\b(?!:80)

看到一个regex demo

如果您确实想要匹配端口 8000 而不是 80,您也可以在 80 之后添加一个单词边界。

由于您根据评论使用grep -Po,因此您也可以使用所有格量词代替词边界。

grep -Po '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]++(?!:80\b)