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”。第一个子句必须以非标点符号结尾,就像你写的那样
考虑一下迈克的回答;更清楚。有道理。我试图以相反的方式来做,而不是从头开始。谢谢。