使用正则表达式匹配两个字符串之间的字符串

Tol*_*ayi 3 regex language-agnostic nested match

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

例如,我有这样的文字:

外部开始一些文本内部开始 文本 - 我想要 内部更多的文本外端

在这种情况下,我想要的是我想要的文本,因为它位于内部开始内部之间,它们本身位于外部开始外部之间.

如果我有

一些文本内部开始 文本 - 我想要 内部更多的文本外端

然后我不想要我想要的文本,因为虽然它在内部开始内部之间,但是没有外部开始包含这些字符串.

同样,如果我有

外部开始一些文本文本 - 我想要 内部更多的文本外端

然后,我不想要我想要的文本,因为没有封闭的内部开始,尽管有封闭的外部开始外部字符串.

假设外开始,内开始,内端外端将仅用于封闭/分隔的目的.

我认为我可以通过执行两次正则表达式匹配来完成此操作,即查找外部开始外部端之间的任何数据,然后在该数据中查找内部开始内部端之间的任何文本(如果确实那些字符串存在),但我想知道它是否可以一次完成.

Way*_*rad 6

/outer-start.*?inner-start(.*?)inner-end.*?outer-end/
Run Code Online (Sandbox Code Playgroud)

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

"外部启动一些文本内部开始第一个文本 - 我想要内部一些更多文本外端外部开始一些文本内部开始第二个文本 - 我想要内部更多文本外端"

没有最小匹配,你将得到令人费解的单一比赛,"第二文本,我想要的".

.*?表示"吃零个或多个字符,但只有你需要的数量才能使表达式的其余部分匹配.使用?",只要表达式的其余部分匹配,正则表达式引擎就会吃尽可能多的字符.

  • @Wayne:为什么不编辑在顶部的模式中包含惰性版本(.*?)?你的答案是肯定的,你对原因有很好的解释.*?优先于.*,但在高可见性示例中使用.*.:-) (3认同)