2017-07-24 91 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),其中'(...)'匹配更好一點(它不會如果有一個'('或一個'''''),則匹配。 –