正则表达式匹配没有标点符号的邮政编码

标签 regex grep

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

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

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

我的正则表达式为:

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

它与 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} 表示零之间的四位数字九、? 表示分组表达式完全存在或不存在,$ 标记行尾。

测试.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 >.

关于正则表达式匹配没有标点符号的邮政编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868471/

相关文章:

c# 正则表达式 : Special characters: ~! @©#$%^&*()_+{}| :"<>?` €[]\;',./

regex - 在同一行中匹配模式 n 次的行

针对 tnsnames.ora 的正则表达式 w/grep

python - 使用 df 命令只显示 %used

javascript - 使用正则表达式在段落标记之间提取文本

JavaScript replace() 一个 html 实体与另一个

regex - Linux:如何仅使用 ls 列出所有文件/目录

Linux - 如何列出所有用户及其 UID

ruby - 如何从 ruby​​ 中的字符串中提取 float ?

regex - 如何在vim中搜索所有大写单词?