匹配不带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]+
这与您的版本略有不同,它断言端口不是 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)
我想匹配端口不是 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]+
这与您的版本略有不同,它断言端口不是 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)