假設有以下字符串:匹配組正則表達式以任何順序
「7個蘋果和13個桔子」
/(\d+).*?(apples)/i
上述正則表達式匹配7個蘋果但如果交替順序和數字爲「45個桔子和9個蘋果」。它將匹配第一個數字45,而不是與我想要的蘋果相對應的數字。
我如何寫一個正則表達式,如果我寫在下面的兩個命令的句子相匹配,並返回數字匹配組+蘋果:
- 「7個蘋果和13個橘子」
- 「13個橘子52蘋果「
即,我想匹配7個蘋果,與7和蘋果和52個蘋果與比賽組52和蘋果的比賽組。
假設有以下字符串:匹配組正則表達式以任何順序
「7個蘋果和13個桔子」
/(\d+).*?(apples)/i
上述正則表達式匹配7個蘋果但如果交替順序和數字爲「45個桔子和9個蘋果」。它將匹配第一個數字45,而不是與我想要的蘋果相對應的數字。
我如何寫一個正則表達式,如果我寫在下面的兩個命令的句子相匹配,並返回數字匹配組+蘋果:
即,我想匹配7個蘋果,與7和蘋果和52個蘋果與比賽組52和蘋果的比賽組。
/(\d+).*?(apples)/i
有錯嗎?.*?
即使是一個懶惰匹配它從數字匹配下一apple
這意味着對於字符串
"13 oranges 52 apples"
它從13
末相匹配,直到apple
由於.
匹配任何東西
看到鏈接的一個例證:http://regex101.com/r/uL5eX0/2
由於符號分隔條件的數字,蘋果是一個空間,你可以使用一個\s
字符而不是.
作爲
(\d+)\s(apples)
比賽7
和52
在http://regex101.com/r/uL5eX0/3
看到對於安全方面你可以有
(\d+)\s+(apples)
任意數量的數字和蘋果之間的空隙
一個單詞邊界\b
也可用於額外的安全
@ nu11p01n73R有時:P – vks 2014-11-01 05:59:57
*有7個比賽組和蘋果*我認爲OP希望蘋果很好,但我不知道爲什麼 – nu11p01n73R 2014-11-01 06:02:59
@ nu11p01n73R,這不是一個很大的原因給予好評的答案... – 2014-11-01 06:09:30
你可以簡單地添加\D*?
而不是.*?
其中.
將匹配在兩者之間的數字,但\D
不會。
(\d+)\D*?(apples)
\D*?
任何字符的非貪婪匹配,但不是數字零次或多次的匹配。
有什麼不對您的正則表達式?
(\d+).*?(apples)
首先,正則表達式引擎會嘗試匹配從左到右滿足給定模式的字符。因此\d+
將匹配第一個數字,並且.*?(apples)
強制引擎匹配字符串apple
以上的所有字符。使用\D*?
而不是.*?
強制引擎匹配任何字符,但不匹配數字零個或多個數字。
+1用於解釋OP問題的根本原因 – 2014-11-01 06:13:30