2015-03-03 67 views
1

我需要得到的最後一場比賽在*一串像爲什麼不使用的regex * +(所有格)不匹配

one 1.234 three 
some text 1.2321 xyz 1 5 1.234 and more text 
some other text 

還需要周圍的文本[0-9] - 即使當沒有像第三行那樣的號碼時

我想使用^(.*)([0-9\.]*+)(.*)$,但它只是匹配第一個(。*)。

另一方面,^(.*?)([0-9\.]*+)(.*?)$只是匹配最後一個(。*?)。

這是爲什麼?我認爲它會盡力滿足所有規則?

我知道我可以排除0-9。從最後*得到我想要的,但我想明白爲什麼上述不工作,雖然我用*

+3

你用'* +'背後的意圖是什麼? – anubhava 2015-03-03 10:48:11

+0

你正在使用哪個正則表達式引擎?根據正則表達式的不同,'* +'可能有完全不同的含義。 – 2015-03-03 10:51:52

+0

PCRE發動機。 * +應該是所有格。不是嗎? – user3159270 2015-03-03 11:20:42

回答

3

一個佔有量詞不保證最長的匹配,它只是防止回溯。你的正規表達式都不會回溯,所以佔有量詞不起作用。

有了第一個正則表達式,第一(.*)消耗整個字符串,然後([0-9.]*+)和第二(.*)每消耗什麼,因爲什麼都不剩相匹配。

在第二個正則表達式中,第一個(.*?)最初不會消耗任何東西,因爲它不太可能。然後([0-9.]*+)成功匹配一些更多的東西,因爲它仍然在字符串的開頭,這不會發生在數字或句點開頭。最後,最後的(.*?)被迫消耗剩下的東西(整個字符串),儘管不願意,因爲它後面跟着一個($)。

爲了解決您的問題,我們需要更多地瞭解您所期望的輸入類型。例如,如果你知道永遠不會有任何數字或時間你要找的號碼後,你可以這樣做:

^(.*?)(?:([0-9.]+)([^0-9.]*))?$ 

這裏的關鍵是,第二個捕獲組,([0-9.]+),用途一個+而不是一個*。如果字符串中沒有數字或句點,則封閉組(?:([0-9.]+)([^0-9.]*))?將不匹配,並且初始(.*?)將被強制使用整個字符串。 (第二組和第三組將爲空)

如果字符串中存在多個數字或句點序列,則第二組保證與最後一個匹配,因爲第三組([^0-9.]*)允許任何內容字符串其餘部分中的那些字符。

這是非常薄弱的​​,但它是我可以用你提供的信息做的最好的。關鍵是,佔有量詞在你可以使用的時候是非常出色的,但這並不像你期望的那麼頻繁。