我有以下任务:
使用带有 -Pao 选项和正则表达式的 grep 从损坏的档案中提取所有电话号码(解决方案:13 个电话号码)。正则表达式应尽可能匹配以下电话号码格式并尽可能短:
我尝试使用数字的相应开头,然后将它们放在一起并继续前进。
我现在有以下代码:
grep -Pao '(\ \d{2}.) | (\d{3,4}) | (\d\s\d{2})' kaputt.txt
(模式为PCRE)
不幸的是,代码没有回传所需的结果,因为搜索条件似乎是相互排斥的。因此,我将不胜感激。
uj5u.com热心网友回复:
管道两侧是否有毛坯?如果是,第一种情况实际上是 ( \d{2}.)\s ,它与任何格式都不匹配。
https://regex101.com/r/qDmGIC/1 - 但它也会匹配不需要的组合,如 111 (1)11 11
uj5u.com热心网友回复:
试图找到可能的绝对最短的正则表达式将是愚蠢的差事。以下应该没问题,因为没有格式似乎是另一种格式的扩展。
grep -Pao "(?:\ \d\d \d\d \d{7}|\ \d\d (\d\d) \d{5} \- \d\d|\ \d\d (\d)\d\d \d{5}\-\d\d|\ \d\d-\d\d\-\d{7}|\ \d\d \d\d \d{5}\-\d\d|\d{4} \d \d{6}|\d \d\d \/ \d\d \d\d \d\d|\d{8}\-\d\d)" kaputt.txt
它只是从所需格式的影像 (!) 中提取的文本,x
替换为\d
、-
替换为\-
、
替换为\
,并且每个替代格式都以 分隔|
。
如果要跨行匹配,-z
则需要该标志,并且每个空格都可以替换为,例如\s
。
0 评论