我正在使用正则表达式来查找长字符串中的波兰语电话号码。可能有+48
,0048
,48
(在括号中没有)后跟9位数字,中间有空格。
第一个想法是:
(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}
这会捕获+48 123 456 789
和123456789
之类的内容,但也会在1234567899876543211
中找到2个电话号码 - 这是不可接受的。所以我添加了单词边界:
\b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}\b
但是这个正则表达式,在(+48) 123 456 789
这样的字符串中只会捕获48) 123 456 789
。为什么开头省略了?
(regex101以及应匹配/不匹配的示例)
答案 0 :(得分:3)
您的\b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}\b
regex与可选部分不匹配,因为字边界是强制性的,而可选图案可能会丢失。例如。 +48 123 456 789
字符串(仅匹配48 123 456 789
)的问题如下:初始\b
需要字边界,+
之前没有字边界,因此它继续前进并在4
之后找到+
- 这就是单词边界所在的位置。接下来,(+48) 123 456 789
仅产生48) 123 456 789
,因为仅在+
和4
之间找到了单词边界。
您可以直接告诉正则表达式引擎只匹配字符串(如果它们之前没有字符串,也不跟单词字符串匹配),而不是使用单词边界。
使用
(?<!\w)(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}(?!\w)
请参阅regex demo
如果匹配项左侧有一个单词char,则(?<!\w)
否定后瞻将使匹配失败,如果在右侧有一个单词char,则(?!\w)
否定前瞻将使匹配失败比赛。