2014-11-01 102 views
0

假設有以下字符串:匹配組正則表達式以任何順序

「7個蘋果和13個桔子」

/(\d+).*?(apples)/i 

上述正則表達式匹配7個蘋果但如果交替順序和數字爲「45個桔子和9個蘋果」。它將匹配第一個數字45,而不是與我想要的蘋果相對應的數字。

我如何寫一個正則表達式,如果我寫在下面的兩個命令的句子相匹配,並返回數字匹配組+蘋果:

  1. 「7個蘋果和13個橘子」
  2. 「13個橘子52蘋果「

即,我想匹配7個蘋果,與7和蘋果和52個蘋果與比賽組52和蘋果的比賽組。

回答

3
  • 如果您在/(\d+).*?(apples)/i有錯嗎?

.*?即使是一個懶惰匹配它從數字匹配下一apple

這意味着對於字符串

"13 oranges 52 apples"

它從13末相匹配,直到apple由於.匹配任何東西

看到鏈接的一個例證:http://regex101.com/r/uL5eX0/2

  • 如何糾正?

由於符號分隔條件的數字,蘋果是一個空間,你可以使用一個\s字符而不是.作爲

(\d+)\s(apples) 

比賽752http://regex101.com/r/uL5eX0/3

看到對於安全方面你可以有

(\d+)\s+(apples)

任意數量的數字和蘋果之間的空隙

一個單詞邊界\b也可用於額外的安全

+3

+1用於解釋OP問題的根本原因 – 2014-11-01 06:13:30

1
(\d+)(?=\s*(apples)) 

試試這個。使用postive lookahead.See demo。

http://regex101.com/r/yG7zB9/17

+0

@ nu11p01n73R有時:P – vks 2014-11-01 05:59:57

+0

*有7個比賽組和蘋果*我認爲OP希望蘋果很好,但我不知道爲什麼 – nu11p01n73R 2014-11-01 06:02:59

+3

@ nu11p01n73R,這不是一個很大的原因給予好評的答案... – 2014-11-01 06:09:30

0

使用這種模式
(\d+)\s++(apples\b)

從擁擠的大衆需求。

(\d+)\s+(apples\b) 

Demo

+0

爲什麼?特別是,你能解釋'\ s ++'中的第二個'+'嗎?爲什麼'\ d ++'中沒有任何內容? – 2014-11-01 06:16:03

+0

OP沒有指定Java。 OP沒有指定PCRE。 OP沒有指定一個正則表達式引擎。 '++'不是要走的路。 – Unihedron 2014-11-01 06:18:24

+0

我的天啊,我的回答涵蓋了比其他所有例子更多的例子,但每個人都在'++'??上挑選!!! – 2014-11-01 06:21:24

0

你可以簡單地添加\D*?而不是.*?其中.將匹配在兩者之間的數字,但\D不會。

(\d+)\D*?(apples) 

\D*?任何字符的非貪婪匹配,但不是數字零次或多次的匹配。

DEMO

有什麼不對您的正則表達式?

(\d+).*?(apples) 

首先,正則表達式引擎會嘗試匹配從左到右滿足給定模式的字符。因此\d+將匹配第一個數字,並且.*?(apples)強制引擎匹配字符串apple以上的所有字符。使用\D*?而不是.*?強制引擎匹配任何字符,但不匹配數字零個或多個數字。