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

Regex 使用正则表达式在两个字符串之间匹配字符串,regex,language-agnostic,match,nested,Regex,Language Agnostic,Match,Nested,我如何使用正则表达式来匹配两个字符串之间的文本,其中这两个字符串本身包含两个其他字符串,而内部和外部包含字符串之间包含任意数量的文本 例如,我有以下文本: 外部开始一些文本内部开始text-that-i-want内部结束更多文本外部结束 在这种情况下,我需要text-that-I-want,因为它位于内部开始和内部结束之间,它们本身位于外部开始和外部结束之间 如果我有 一些文本内部开始text-that-i-want内部结束更多文本外部结束 然后我不想要text-that-I-want,因为尽管

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

例如,我有以下文本:

外部开始一些文本内部开始text-that-i-want内部结束更多文本外部结束

在这种情况下,我需要text-that-I-want,因为它位于内部开始内部结束之间,它们本身位于外部开始外部结束之间

如果我有

一些文本内部开始text-that-i-want内部结束更多文本外部结束

然后我不想要text-that-I-want,因为尽管它介于内部开始内部结束之间,但没有外部开始包含这些字符串

同样,如果我有

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

再说一遍,我不想要text-that-I-want,因为这里没有封闭的内部开始,尽管有封闭的外部开始外部结束字符串

假设外部开始内部开始内部结束外部结束仅用于封闭/定界


我认为我可以通过两次正则表达式匹配来实现这一点,即查找外部开始外部结束之间的任何数据,然后在该数据中查找内部开始内部结束之间的任何文本(如果确实存在这些字符串),但我想知道这是否可以一次性完成。

我想你可以这样做:


outer-start .*? inner-start (.*?) inner-end .*? outer-end
当存在多个“text-that-i-want”时,您需要使用最小匹配来防止regexp引擎出现故障,例如:

“外部开始一些文本内部开始first-text-that-i-want内部结束更多文本外部结束外部开始一些文本内部开始second-text-that-i-want内部结束更多文本外部结束”

如果没有最小匹配,您将得到令人费解的单一匹配,“second-text-that-i-want”


那个女孩?方法可以不吃任何字符或更多字符,但只吃使表达式其余部分匹配所需的字符数。使用?时,只要其余表达式匹配,regexp引擎将吃掉尽可能多的字符。

看起来Brian在发布此解决方案方面胜过了我。我加上问号的原因是为了让你免于一个贪婪的正则表达式带来的麻烦。你可能会想把它们包括在内。事实上,通过贪婪匹配,你会在捕获组中得到“first-text-that-i-want inner end更多的文本outer end outer start一些文本inner start second-text-that-i-want”。Michal:不,第一个(非分组)
*
会吃掉你引用的大部分文本。哎哟。。。正确的。我的错,谢谢你的纠正。事实上,这正是删除我的答案和+1这个答案的好理由。@Wayne:为什么不进行编辑,将懒惰版本(.*)包含在顶部的模式中?根据您的回答,您已经很好地解释了原因。*?优先于。*,但在高可见性示例中使用。*:-)@迈克尔:哦,我太粗心了。我测试了好的和坏的正则表达式,但是当我发布答案时,我复制并粘贴了坏的正则表达式。糟糕的程序员,没有饼干!谢谢你关注我的背后。用真实的例子代替这些“外部开始”占位符可能会给你一个更好的答案。
/outer-start.*?inner-start(.*?)inner-end.*?outer-end/