3

如何使用正则表达式匹配两个字符串之间的文本,其中这两个字符串本身包含两个其他字符串,并且内部和外部封闭字符串之间有任意数量的文本?

例如,我有这样的文字:

外部开始一些文本内部开始 文本我想要的 内部结束一些更多文本外部结束

在这种情况下,我想要text-that-i-want因为它在inner-startinner-end之间,而它们本身又在outer-startouter-end之间。

如果我有

一些文本内部开始 文本我想要的 内部结束一些更多文本外部结束

那么我不想要text-that-i-want,因为虽然它在inner-startinner-end之间,但没有包含这些字符串的外开始。

同样,如果我有

外部开始一些文本我想要的文本 内部结束一些更多文本外部结束

再说一次,我不想要text-that-i-want,因为没有封闭的 inner-start,尽管有封闭的 outer-startouter-end字符串。

假设outer-startinner-startinner-endouter-end将永远只用于封闭/分隔的目的。

我认为我可以通过执行两遍正则表达式匹配来做到这一点,即查找external-startouter-end之间的任何数据,然后在该数据中查找inner-startinner-end之间的任何文本(如果确实如此这些字符串存在),但我想知道是否可以一次性完成。

4

2 回答 2

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

当有多个“我想要的文本”时,您需要使用最小匹配来防止正则表达式引擎出现故障,例如:

“外部开始一些文本内部开始第一个文本我想要内部结束一些更多文本外部结束外部开始一些文本内部开始第二个文本我想要内部结束一些更多文本外端"

如果没有最小匹配,您将得到令人费解的单一匹配,“我想要的第二个文本”。

这 。*?意思是“吃零个或多个字符,但只需要使表达式的其余部分匹配。使用?,只要表达式的其余部分匹配,正则表达式引擎就会吃尽可能多的字符。

于 2010-01-02T06:50:05.177 回答
3

我想你可以做类似的事情:


outer-start .*? inner-start (.*?) inner-end .*? outer-end
于 2010-01-02T06:43:08.943 回答