2015-05-08 138 views
0

這可能是一個很難回答正則表達式的問題,但我無法解決它。這裏是我的正則表達式:正則表達式貪婪

regex = (^|(?<=))Football(((\S+)+?(?=Football)|(\S+)+)|)fun(((\S+)+?(?=Football)|(\S+)+)|)Football\ is\ important((?=)|$) 

有了,我想捕捉這些:

text1 = "Football is fun I like Football is important" 
text2 = "Fun to watch Football I think Football is important" 
text3 = "Fun to watch Football I like Football" 

但不是這樣的:

text4 = "Football is fun I like Football Football is important" 

據我理解,表達不該」因爲這裏還有一個足球。第二(((\S+)+?(?=Football)|(\S+)+)|)部分應該匹配I like,因爲在此之後Football在那裏,它不貪婪,因爲我加了?後第二+。最後一部分應該匹配Football is important,所以有一個Football(在中間)掛着。我如何修改它以使它符合我的需求?

更澄清的問題:

(((\S+)+?(?=Football)|(\S+)+)|)部分應該沒有空格字符匹配,直到它認爲足球和返回什麼了。所以這個正則表達式不應該與text4匹配,因爲它只有兩個足球。另一方面text4包含3個足球。希望現在更清楚。

對不起,這個愚蠢的例子;我改變了我的真實文本。

+0

我想你可以使用一個簡單的正則表達式來完成這項工作。 –

+0

你試圖從原始文本中捕獲什麼? – Totem

+0

'^足球(\ w +){4}足球(\ w +)\ w + $'和很多正則表達式都會匹配您的句子! – Kasramvd

回答

0

funfootball第一次出現後強制 - 第二句和第三句所無法比擬的,因爲沒有fun那裏;)

text4是一個比較複雜的解釋。它匹配,由於第二次發生(((\S+)+?(?=Football)|(\S+)+)|)匹配I like Football。 每個單詞都與內部零件(\S+)+?相匹配。 你說得對。您正在使用+?在這裏 - 但也有內部分兩個機會:

  • 比賽I like (Football)
  • 比賽I like Football (Football)

都是有效的(\S+)+?(?=Football) - 究竟是它的至少一部分,只取決於下一步。

使用圖案(\S+)+?(?=Football)Football與文本I like Football Football。它將matche I like Football(如你所料)。

現在,將模式修改爲(\S+)+?(?=Football)Football$。現在你會看到完整的文本是匹配的。 $無法匹配,如果你在Football的第一次發生時停下來。文本的其餘部分也必須匹配 - 因爲Football可以匹配\S+,一切都是完全有效的。

希望有所幫助。