2017-08-17 83 views
3

我有一个基本的IP正则表达式,检查IP是在0.0.0.0到255.255.255.255。当我进入为什么从{3}更改为{4}不适用于此正则表达式?

grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" file.txt 

它一共有12个IP地址(这是正确的我的文本文件),但只突出了前3个字节,当我需要它来突出第四个八位也很相配。但改变它“{4}”显示没有匹配。

grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}" file.txt 

我快速的问题是为什么不突出整整4个字节为使用{4}匹配?

回答

4

它与第四个字节不匹配,因为表达式与八位位组匹配,然后.正好三次。由于在第4个八位字节后没有.,所以它不匹配,也没有突出显示。

您可以使用

grep -E "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.?){4}" 

这里,\.?比赛1个或0 .字符(即.是可选的,所以第四个八位现在将匹配和将得到突出显示)。

或者,更精确的图案也会做:

grep -E "(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]?)){3}" 

它将匹配,并强调整个IP地址字符串。

您可以根据您的要求在模式中添加锚或字边界。例如。这里是一个字边界模式的变化:

grep -E "\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]?)){3}\b" 

enter image description here

+0

不幸的是,当我实现“” \?“”它开始接受错误的IP地址,如“1334.0.1.234”和它甚至不突出显示整个IP地址,它切断在''1334.0。'' –

+0

是的,这就是为什么我建议更精确的模式。如果您需要确保它匹配整个单词,请使用单词边界。 –

+0

我也尝试过第二种模式,因为它是一个我理解的概念,并且它保持了相同的结果[https://imgur.com/a/V4qsC] –

相关问题