Regex 正则表达式匹配不带标点的邮政编码

Regex 正则表达式匹配不带标点的邮政编码,regex,grep,Regex,Grep,我有一个文件,上面有一堆不同的邮政编码: 12345 12345-6789 1234567890 12345:6789 12345-7890 12:1234678 我只想匹配格式为12345或12345-6789的代码,但忽略所有其他形式 我的正则表达式为: grep-E'\[^[:punct:]\-[0-9]{4}样本文件 它与12345-6789匹配,因为“or”子句与该特定子句匹配。我不明白为什么它在第一个12345上不匹配,因为我的表达式应该说“匹配5个数字,但忽略任何标点符号。”匹配

我有一个文件,上面有一堆不同的邮政编码:

12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678
我只想匹配格式为
12345
12345-6789
的代码,但忽略所有其他形式

我的正则表达式为:

grep-E'\[^[:punct:]\-[0-9]{4}样本文件


它与
12345-6789
匹配,因为“or”子句与该特定子句匹配。我不明白为什么它在第一个
12345
上不匹配,因为我的表达式应该说“匹配5个数字,但忽略任何标点符号。”

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

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之间的正好四位数字,
表示分组表达式完全存在或不存在,
$
标记行的结尾

测试.dat

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
。这也适用于与
fgrep
相同的
grep-F
和与
rgrep
相同的
grep-r
,它不匹配“12345”,但匹配“12345a”。第一个子句必须以非标点符号结尾,就像你写的那样


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

有道理。我试图以相反的方式来做,而不是从头开始。谢谢。