2014-09-25 82 views
1

我有以下的正則表達式正則表達式開始從以前的比賽最後一個字母匹配

(\{\w*\}\s*[^{}]+\s*)\{? 

,我對這個字符串

this {match} is cool{match} but {match} this one is more cool 

目前我能捕捉2組測試它 - >{match} is cool{match} this one is more cool,所以你可以看到組but {match}缺失。

之所以這樣,是因爲去年,匹配的是{,所以在接下來的匹配反過來他會跳過{,並不會能夠匹配到新{發生。

有沒有人知道如何強制匹配中間組?

調試:http://regex101.com/r/hM5xE6/2

+0

你想捕捉'但是{}匹配'或'{}匹配but'?因爲如果它是第一個,那麼與你捕獲的其他模式不同。如果你試圖捕獲'{match} but',那麼它就是相同的模式。 – 2014-09-25 12:28:41

回答

4

你可能只刪除\{?(和\s*太);您也不需要捕捉括號:

\{\w*\}[^{}]+ 

測試它live on regex101.com

如果要強制在比賽一{前或在字符串的結尾結束,你可以使用一個positive lookahead assertion

\{\w*\}[^{}]+(?=\{|$) 

但是,你只需要,如果你想避免如果嵌套大括號完全匹配,如{{match} whatever},其中第一個正則表達式會找到{match} whatever

+0

好的第二個解決方案。但我確實認爲OP希望獲得這些比賽,並且關於比賽預測的解釋可以改善您的回答。 – Tensibai 2014-09-25 12:23:23

+0

@Tensibai:「獲得比賽」是什麼意思?正則表達式獲取匹配,它不會(另外)將它們捕獲到包含完全相同文本的組中。 – 2014-09-25 12:25:01

+0

我的意思是有捕獲組供以後使用,但不知道使用的語言,這是我的一個假設,你是對的。編輯,ooops,起初沒有看到regex101的鏈接,忘記了解釋請求:) – Tensibai 2014-09-25 12:27:28

1

您可以使用以下regular expression開始在以前的比賽

\{\w*\}[^{}]+(?=\{|$) 
1

要包括在正則表達式的下一個{(但不是在比賽)從最後一個字母匹配,所以它開始的下一場比賽之後的字符,跳過第一個{並且不匹配,直到達到第二個。

不需要lookahead或類似的東西。 如果去掉後面檢查\{?,你會得到所有三場比賽(也可以刪除括號中的}最後\s*):

(\{\w*\}\s*[^{]+)

http://regex101.com/r/hM5xE6/7

你也可以使用下面的正則表達式,這取決於你需要具體怎麼是與捕獲:

(\{\w*\}[\w\s]*)

http://regex101.com/r/hM5xE6/5

相關問題