2017-07-26 55 views
2

我有以下的正則表達式(我的實際正則表達式實際上是一個複雜得多,但我牽制我的問題這一點):\s(?<number>123|456)\s正則表達式不返回所有匹配

而且下面的測試數據:

「123 456」

如預期的/想要的結果我會在2個匹配的正則表達式匹配之一與「號碼」是「123」和第二個號碼是「456」。不過,我只得到1個匹配,「數字」是「123」。

我也注意到,在測試數據確實給2場比賽在增加「123」恩「456」之間的另一空間...

爲什麼我沒有得到我想要的結果呢?如何解決它?

+0

你在用什麼語言? – TheSolider

+0

@TheSolider有一個PCRE標籤。 –

回答

2

您的模式包含消費\s與數字前後的空白匹配的模式,並且輸入包含連續的數字,用單個空格分隔。如果數字之間有兩個空格,它將起作用。

使用基於lookarounds空白界限:

(?<!\S)(?<number>123|456)(?!\S) 

regex demo

(?<!\S)是負回顧後,將失敗的比賽,如果有一個非空白字符立即向當前位置(?!\S)是一個負面預測,如果當前位置的右邊立即有非空白字符,則匹配將失敗。

(?<!\S)(?<=^|\s)相同,而(?!\S)(?=$|\s)相同,但效率更高。

注意,在很多情況下,你甚至可以用1個向前看去,並使用

\s(?<number>123|456)(?!\S) 

它將確保連續的空格分隔找到匹配。

+1

感謝您的幫助!正確的答案和很好的解釋 – ADE

相關問題