2010-01-02 55 views
3

如何使用正則表達式來匹配兩個字符串之間的文本,其中這兩個字符串本身包含兩個其他字符串,且內部和外部封閉字符串之間具有任意數量的文本?使用正則表達式來匹配兩個字符串之間的字符串

例如,我有這樣的文字:

外啓動一些文本內啓動文本是 - 我想做內端一些文字outer-結束

在這種情況下,我想文本是 - 我想做貝科使用它在內啓動內端,它們本身在外啓動外端

如果我有

一些文本內啓動文本是 - 我想做內端一些文字外端

然後我不想要text-that-i-want,因爲雖然它在內啓動內部末端,沒有外部開始包圍這些字符串。

同樣的,如果我有

外啓動一些文本文本說,我想做內端一些文字外端

然後再次,我不想文本,我想要,因爲沒有包含內部啓動,雖然有外圍外部啓動外部端口字符串。

假設外啓動內啓動內端外端將只被用於包封/限界的目的。

我認爲我可以做一個兩遍正則表達式匹配,即尋找外啓動外端,然後之間的所有數據間內的數據尋找任何文本內啓動內端(如果存在確實的字符串),但我想知道它是否可以一次完成。

+0

真實的例子,而不是這些「外部開始」的佔位符,可能會讓你更好的答案。 – 2010-01-02 07:14:45

回答

6
/outer-start.*?inner-start(.*?)inner-end.*?outer-end/ 

你需要使用最少的匹配,以保持從發生故障的正則表達式引擎當有多個「文本 - 那 - 我想做」 S,例如:

「outer-start some text inner-start first-text-that-i-want inner-end some more text outer-end outer-start some text inner-start second-text-that-i-想要內部更多的文字外端「

如果沒有最小匹配,你會得到令人費解的單個匹配,即「我想要的第二文本」。

The。*?意味着「吃零個或多個角色,但只有儘可能多地使表達式的其餘部分匹配。使用?,只要表達式的其餘部分匹配,正則表達式引擎就會盡可能多地使用字符。

+0

事實上,通過貪婪的匹配,你會得到「頭文本 - 我想要內部結束更多文本外部結束外部啓動一些文本內部 - 開始第二個文本 - 我想要的「在捕獲組中 – 2010-01-02 06:59:42

+0

Michal:不,第一個(和非分組的)'。*'吃掉你引用的大部分文字 – 2010-01-02 07:08:43

+0

ouch ... right。My b廣告,感謝您的更正。事實上,這是刪除我的答案和+1這個很好的理由。 – 2010-01-02 07:28:11

3

我想你可以這樣做:


outer-start .*? inner-start (.*?) inner-end .*? outer-end 
+0

看起來像布賴恩打敗我張貼這個解決方案。我包括問號的原因是爲了避免麻煩與貪婪的正則表達式。你可能想要包含它們 – 2010-01-02 06:48:12

相關問題