正则表达式匹配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}' 

我什么也得不到。我缺少什么?

+4

如果你使用'grep -E'([0-9] {1,3} \。?){4}''?您使用了POSIX ERE模式,但未通过'-E'选项。因此,'grep'使用POSIX BRE。 –

+0

@WiktorStribiżew这工作。谨慎地阐述一个答案,以便我可以接受它?我也希望看到如何使用BREs解决我的问题 – mrbolichi

+0

我没有注意到该评论,但我实际上正在研究此更新,以显示BRE语法如何在此处使用。 –

您使用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\}' 

another demo

基本上,它匹配:

  • [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

+1

该正则表达式[不会工作](https://regex101.com/r/qFE95M/1)。改用[this](https://regex101.com/r/qFE95M/2)。 – Olian04

+0

@ Olian04:我明白你的意思,我只是将OP正则表达式转换为POSIX BRE/ERE。编辑。 –

+0

谢谢。除了额外的见解之外,这正是我所期待的。 – mrbolichi