我想从文件中获取电话号码.我知道数字有不同的形式,我可以处理一个,但不知道如何获得统一的正则表达式.例如
xxx-xxx-xxxx
(xxx)xxx-xxxx
xxx xxx xxxx
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本身〜
这只是Alan Moore解决方案的修改版本。这可以防止某些种族情况,其中数字的最后部分包含四位数以上,或者数字的总位数超过10:
grep '\(\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?\)\{2\}[0-9]\{4\} '
Run Code Online (Sandbox Code Playgroud)
说明:
\(([0-9]\{3\})\|[0-9]\{3\}\)精确匹配三个数字(例如234),带或不带括号。\|执行“或”操作。\( ... \)将上述格式组合在一起,然后再加上space或-或no space-([ -]\?)。\{2\}场比赛正好出现两次以上的[0-9]\{4\} '比赛恰好一个发生了4位数字后跟一个space 而且它也短一些。在RHEL和Ubuntu上测试。干杯!!