我有以下的正則表達式(我的實際正則表達式實際上是一個複雜得多,但我牽制我的問題這一點):\s(?<number>123|456)\s
正則表達式不返回所有匹配
而且下面的測試數據:
「123 456」
如預期的/想要的結果我會在2個匹配的正則表達式匹配之一與「號碼」是「123」和第二個號碼是「456」。不過,我只得到1個匹配,「數字」是「123」。
我也注意到,在測試數據確實給2場比賽在增加「123」恩「456」之間的另一空間...
爲什麼我沒有得到我想要的結果呢?如何解決它?
我有以下的正則表達式(我的實際正則表達式實際上是一個複雜得多,但我牽制我的問題這一點):\s(?<number>123|456)\s
正則表達式不返回所有匹配
而且下面的測試數據:
「123 456」
如預期的/想要的結果我會在2個匹配的正則表達式匹配之一與「號碼」是「123」和第二個號碼是「456」。不過,我只得到1個匹配,「數字」是「123」。
我也注意到,在測試數據確實給2場比賽在增加「123」恩「456」之間的另一空間...
爲什麼我沒有得到我想要的結果呢?如何解決它?
您的模式包含消費\s
與數字前後的空白匹配的模式,並且輸入包含連續的數字,用單個空格分隔。如果數字之間有兩個空格,它將起作用。
使用基於lookarounds空白界限:
(?<!\S)(?<number>123|456)(?!\S)
的(?<!\S)
是負回顧後,將失敗的比賽,如果有一個非空白字符立即向左當前位置(?!\S)
是一個負面預測,如果當前位置的右邊立即有非空白字符,則匹配將失敗。
(?<!\S)
與(?<=^|\s)
相同,而(?!\S)
與(?=$|\s)
相同,但效率更高。
注意,在很多情況下,你甚至可以用1個向前看去,並使用
\s(?<number>123|456)(?!\S)
它將確保連續的空格分隔找到匹配。
感謝您的幫助!正確的答案和很好的解釋 – ADE
你在用什麼語言? – TheSolider
@TheSolider有一個PCRE標籤。 –