3

我有一个包含一堆不同邮政编码的文件:

12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678

我只想匹配格式为12345or的代码12345-6789,但忽略所有其他形式。

我有我的正则表达式:

grep -E '\<[0-9]{5}\>[^[:punct:]]|\<[0-9]{5}\>-[0-9]{4}' samplefile

它匹配 the,12345-6789因为“或”子句匹配那个特定的子句。我很困惑为什么它不会在第一个匹配,12345因为我的表达应该说“匹配 5 个数字但忽略任何标点符号”。

4

2 回答 2

9

与所需输出匹配的表达式是:

egrep "^[0-9]{5}([-][0-9]{4})?$" samplefile

表达式分解:

^[0-9]{5}- 找到以 5 位数字开头的行。^表示行首,[0-9]{5}正好是 0 到 9 之间的五位数字。

([-][0-9]{4})?$- 可能以破折号和四位数字结尾或根本没有。()将表达式组合在一起,[-]表示短划线字符,[0-9]{4}恰好表示 0 到 9 之间的四个数字,?表示组合表达式完全存在或不存在并$标记行尾。

测试数据

12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678

在测试数据上运行表达式:

mike@test:~$ egrep "^[0-9]{5}([-][0-9]{4})?$" test.dat 
12345
12345-6789
12345-7890

附加信息:grep -E也可以写成egrep. 这也适用于grep -F与 相同fgrepgrep -r与 相同的情况rgrep

于 2013-02-14T05:46:14.393 回答
0

它不会匹配“12345”,但会匹配“12345a”。第一个子句需要以非标点字符结尾,就像你写的那样。

考虑迈克的回答;它更清楚。

于 2013-02-14T05:49:47.707 回答