为什么从{3}更改为{4}对此正则表达式不起作用?

时间:2017-08-17 09:13:15

标签: regex grep

我有一个基本的IP正则表达式,用于检查ip是否在0.0.0.0到255.255.255.255之间。当我进入

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

它匹配总共12个ip地址(这对我的文本文件是正确的)但只突出显示前3个八位字节,当我需要它突出显示第4个八位字节时。但改变它" {4}"显示没有匹配。

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

我的简单问题是为什么不使用{4}突出显示完整的4个八位字节作为匹配?

1 个答案:

答案 0 :(得分:4)

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

您可以使用

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

此处,\.?匹配1或0 .个字符(即.是可选的,因此第4个八位字节现在将匹配并将突出显示。)

或者,更精确的模式也可以:

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