grep regex意外匹配 - 与数字的字面匹配

时间:2014-05-06 14:54:15

标签: regex grep

为什么以下文字字符串

1998-${year} 

..匹配grep命令:

grep "[0-9 ]*-[ 0-9]*"  filename.txt ?

我需要的是一个正则表达式,以匹配包含年份范围或仅包含年份值的以下任何字符串。

sdkfmslf 1998-2008
asdassdadsa 1998 - 2008
mkklml mklsmdf 2006

..但不是这一个:

asdsad a s 1998-${year}

3 个答案:

答案 0 :(得分:0)

*表示“匹配零或更多”。你想要+,意思是“一个或多个。”

grep "[0-9 ]+-[0-9]+"  filename.txt

答案 1 :(得分:0)

试试[0-9]{4}(\s*-\s*[0-9]{4})?。这将匹配一个4位数字,或者如果它后面跟着(可选空格) - (可选空格),那么必须跟着另一个4位数字。

你的字符串" asdsad a s 1998 - $ {year}"仍然匹配,因为它有一个4位数值。

答案 2 :(得分:0)

我不喜欢回答我自己的问题,但以上都没有。这是我通过实验发现的。我相信可以有更优雅的解决方案,但这是一个有效的版本:

 grep "[0-9][0-9][0-9][0-9][ ]*[\-]*[ ]*[0-9]*"  filename.txt