正则表达式在句子中使用MATCH数字字符串(带有可选文本)

时间:2018-01-11 14:01:11

标签: regex google-sheets

我正在尝试编写一个只匹配字符串的正则表达式:

89-72 
10-123
109-12
122-311(a)
22-311(a)(1)(d)(4)

这些字符串嵌入在句子中,有时在句子中有2个可能的匹配,如下所示:

  

在参考 122-311(a)部分的 10-123 部分,有一个电话号码456-234-2222

我不想匹配手机。这是我目前正在使用的正则表达式

\d{2,3}\-\d{2,3}(\([a-zA-Z0-9]\))*

请参阅DEMO

我一直在寻找Stack并且还没有找到任何东西。任何帮助,将不胜感激。将在google工作表中使用这个并且可能是postgres。

2 个答案:

答案 0 :(得分:2)

要与电话号码不匹配,您必须指明匹配必须既不在前面,也不在后面,\ d或 - 。 Google电子表格使用的RE2不支持查看断言(请参阅the list of supported feature),据我所知,唯一的解决方案是在匹配前后添加字符或字符串边界:

(?:^|[^-\d])\d{2,3}\-\d{2,3}(\([a-zA-Z0-9]\))*(?:$|[^-\d])

(?:^|[^-\d])表示行的开头(^)或不是的字符 - 或\ d(您可能想要更改它,并禁止所有字母)。 $是一行的结尾。 ^$仅使用/m标记执行您想要的操作

正如您所看到的here,这会找到正确的字符串,但在某些匹配项周围会有额外的空格。

答案 1 :(得分:2)

基于正则表达式,@WiktorStribiżew建议:

=REGEXEXTRACT(A1,REPT("\b(\d{2,3}-\d{2,3}\b(?:\([A-Za-z0-9]\))*)(?:[^-]|$)(?:.*)",LEN(REGEXREPLACE(REGEXREPLACE(A1,"\b(\d{2,3}-\d{2,3}\b(?:\([A-Za-z0-9]\))*)(?:[^-]|$)", char (9)),"[^"&char(9)&"]",""))))

公式将返回所有匹配。

字符串:

A

In 22-311(a)(1)(d)(4) section 10-123 which ... 122-311(a) ... number 456-234-2222

输出:

B                   C       D                  

22-311(a)(1)(d)(4)  10-123  122-311(a)

解决方案

要从字符串中提取所有匹配项,请使用以下模式:

=REGEXEXTRACT(A1, REPT(basic_regex & "(?:.*)", LEN(REGEXREPLACE(REGEXREPLACE(A1,basic_regex, char (9)),"[^"&char(9)&"]",""))))

功能的尾部:

LEN(REGEXREPLACE(REGEXREPLACE(A1,basic_regex, char (9)),"[^"&char(9)&"]","")))

仅用于查找数字3 - 字符串中模式的条目数。