我正在尝试编写一个只匹配字符串的正则表达式:
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。
答案 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 - 字符串中模式的条目数。