2011-04-08 91 views
1

如何在包含第一次出現和排除第二次出現的同時獲得序列的第一次和第二次出現之間的文本?在第一次和第二次出現序列之間獲取文本

因此,例如:

讓我的順序是= "xx - "
讓我的文字是= "xx - blablabla bla blaxx - blablabla bla bla xx - blabla"

所以我想我的正則表達式來獲得這個塊:

"xx - blablabla bla bla" 

我試着像這樣:

^xx - .*xx - 

但這會得到第一個和第三個事件之間的文本,並不排除上次發生。

回答

3
(xx -)(.*?)\1 

說明

 
(xx -)  # your sequence (group 1) 
(.*?)  # anything, match non-greedily into group 2 
\1   # whatever group 1 was 

你要組2

的內容,請注意,正則表達式引擎使用不同風格的背參考的,以\1最常見的選擇是$1


這就是爲什麼你的方法不起作用:你的錯誤是非常普遍的。它包括認爲.*以某種方式神奇地停止在正確的點,讓其餘的正則表達式匹配。它不是。

.*直接到行/字符串的末尾,沒有任何考慮。這就是所謂的「貪婪匹配」。當它碰到字符串的末尾時,會發生回溯。正則表達式的其餘部分可以匹配的第一個點是您的序列的最後一次出現,從字符串的末尾看到。你會以最長的匹配結束。

.*?做所謂的「非貪婪匹配」。它在移動到下一個字符之前檢查其餘的正則表達式。這就是爲什麼你的序列的第一次出現可以匹配。你會以最短的比賽結束。

+0

這裏棘手的部分是他也想要第一個分隔符。我還沒有能夠想出一個正則表達式來做到這一點。我最近來的是:'(xx - )。*?(?= \ 1)',它返回2個匹配。即使如此,如果字符串中沒有第二個分隔符,它也不會起作用。 – Talljoe 2011-04-08 09:17:57

+0

@Talljoe:好像在比賽結束後你不能連接組1和組2的結果。 ;-)一個人可以使事情變得比他們複雜得多...... – Tomalak 2011-04-08 09:22:32

+0

@Tomalak,真的。雖然試圖找到一個單一的解決方案。 Concat在這裏可能無法使用。 – Talljoe 2011-04-08 09:27:58

0

根據您的語言,

>> string="xx - blablabla bla blaxx - blablabla bla bla xx - blabla" 
=> "xx - blablabla bla blaxx - blablabla bla bla xx - blabla" 
>> string.split("xx -")[1] 
=> " blablabla bla bla" 
>> "xx -" + string.split("xx -")[1] 
=> "xx - blablabla bla bla" 
>> 

做 「XX - 」 分裂。你想要的項目總是在第二個位置,即索引1.加回「xx - 」得到最終的字符串。不需要太多的正則表達式。

相關問題