正则表达式匹配IP地址
问题描述:
我想通过正则表达式匹配在traceroute
的输出中找到的IP地址。我并不想验证它们,因为它是足够安全的假设traceroute
有效(即不输出像999.999.999.999
我想下面的正则表达式:在regex101,它正则表达式匹配IP地址
([0-9]{1,3}.?){4}
我测试它并验证IP地址。然而,当我尝试
echo '192.168.1.1 foobar' | grep '([0-9]{1,3}.?){4}'
我什么也得不到。我缺少什么?
答
您使用POSIX ERE模式,但没有通过-E
选项有grep
使用POSIX ERE风味。因此,grep
使用POSIX BRE代替,在那里您需要转义{n,m}
量词和(...)
以使它们被解析为特殊的正则表达式运算符。
为了与grep
你的模式工作,你想你可以使用方式:
grep -E '([0-9]{1,3}\.?){4}'
(请注意,你需要逃脱.
所以它只能匹配一个点)
见一个online demo。
POSIX的BRE版本相同的正则表达式:
grep '\([0-9]\{1,3\}\.\?\)\{4\}'
然而,这个正则表达式也会因为.
是可选匹配的几个数字组成的字符串。您可以通过展开模式为
grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}'
或BRE版本解决这个问题:
grep '[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}'
基本上,它匹配:
-
[0-9]{1,3}
- 1 3次出现的任何ASCII数字的 -
(\.[0-9]{1,3}){3}
- 3出现:-
\.
- 字面.
-
[0-9]{1,3}
- 1到任何ASCII码的3次出现
-
您还可以用单词边界调整它(可\<
/\>
或\b
)等
其实,你可能需要使用一个more precise IP matching regex。
如果你使用'grep -E'([0-9] {1,3} \。?){4}''?您使用了POSIX ERE模式,但未通过'-E'选项。因此,'grep'使用POSIX BRE。 –
@WiktorStribiżew这工作。谨慎地阐述一个答案,以便我可以接受它?我也希望看到如何使用BREs解决我的问题 – mrbolichi
我没有注意到该评论,但我实际上正在研究此更新,以显示BRE语法如何在此处使用。 –