grep与正则表达式的电话号码

sky*_*oor 16 regex grep

我想从文件中获取电话号码.我知道数字有不同的形式,我可以处理一个,但不知道如何获得统一的正则表达式.例如

  1. xxx-xxx-xxxx

  2. (xxx)xxx-xxxx

  3. xxx xxx xxxx

  4. xxxxxxxxxx

我只能一起处理1,2和4

grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
Run Code Online (Sandbox Code Playgroud)

是否有任何一个正则表达式可以处理所有这四种形式?

Ala*_*ore 18

grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
Run Code Online (Sandbox Code Playgroud)

说明:

([0-9]\{3\}) 括号内的三位数

\| 要么

[0-9]\{3\}三位没有内部括号

...使用分组括号 - \(...\)- 在交替周围,所以无论哪种替代匹配,正则表达式的其余部分都表现相同.


小智 6

通常有四种电话号码模式

1. xxx-xxx-xxxx         grep -o '[0-9]\{3\}\-[0-9]\{3\}\-[0-9]\{4\}'  file.txt
2. (xxx)xxx-xxxx        grep -o '([0-9]\{3\})[0-9]\{3\}\-[0-9]\{4\}'  file.txt
3. xxx xxx xxxx         grep -o '[0-9]\{3\}\s[0-9]\{3\}\s[0-9]\{4\}'  file.txt
4. xxxxxxxxxx           grep -o '[0-9]\{10\}' file.txt
Run Code Online (Sandbox Code Playgroud)

在所有

grep -o '\([0-9]\{3\}\-[0-9]\{3\}\-[0-9]\{4\}\)\|\(([0-9]\{3\})[0-9]\{3\}\-[0-9]\{4\}\)\|\([0-9]\{10\}\)\|\([0-9]\{3\}\s[0-9]\{3\}\s[0-9]\{4\}\)' file.txt
Run Code Online (Sandbox Code Playgroud)

当然,可以简化上面的正则表达式,但我们也可以将这种简化留给grep本身〜


Mac*_*ers 5

这只是Alan Moore解决方案的修改版本。这可以防止某些种族情况,其中数字的最后部分包含四位数以上,或者数字的总位数超过10:

grep '\(\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?\)\{2\}[0-9]\{4\} '
Run Code Online (Sandbox Code Playgroud)

说明:

  1. \(([0-9]\{3\})\|[0-9]\{3\}\)精确匹配三个数字(例如234),带或不带括号。\|执行“或”操作。
  2. 首先\( ... \)将上述格式组合在一起,然后再加上space-no space-([ -]\?)。
  3. \{2\}场比赛正好出现两次以上的
  4. [0-9]\{4\} '比赛恰好一个发生了4位数字后跟一个space

而且它也短一些。在RHEL和Ubuntu上测试。干杯!!