2017-07-24 90 views
1

我正在为正则表达式寻找一个长字符串中的波兰语电话号码。可能有+48,0048,48(在括号中不是)后跟9位数字,其间有空格。波兰语电话号码的正例表达式

的第一个想法是:

(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3} 

这捕获之类的东西+48 123 456 789123456789,但也将在1234567899876543211发现2个电话号码 - 这是不能接受的。所以我加了字边界:

\b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}\b 

但这个表达式,在一个字符串,如(+48) 123 456 789只捕获48) 123 456 789。为什么被忽略?

regex101与应匹配什么例子/不应该匹配)

+1

空间是否总是三个一组? –

+0

@WillemVanOnsem对于一些错误消息,我很确定,所以是的,我们可以做出这个假设。 – maestromusica

+0

这是由于字边界,将其移动到数字。在非字字符之前,添加'\ B'。 –

回答

2

\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

如果对本场比赛的丢下一句话字符的(?<!\w)负回顾后会失败的比赛,并(?!\w)负先行将失败的比赛,如果有在比赛的右侧是一个字。

+0

我还是不明白为什么我的表情不起作用,但是你的解决方案非常优雅地解决了这个问题:) – maestromusica

+1

好吧,我添加了一个小的解释,为什么OP中共享的最后一个正则表达式不起作用。在可选模式之前添加单词边界不起作用的解释更加困难:重点是单词边界是强制性的,而模式不是。我只能使用边界条件来处理单词边界 - 参见[这个正则表达式变体](https://regex101.com/r/XtQlY1/1),其中'(...)'匹配更好一点(它不会如果有一个'('或一个'''''),则匹配。 –