如何使用正则表达式匹配两个字符串之间的文本,其中这两个字符串本身包含两个其他字符串,内部和外部封闭字符串之间有任意数量的文本?
例如,我有这样的文字:
外部开始一些文字内部开始 文字 - 我想要 内端一些更多文字外端
在这种情况下,我想要我希望的文字,因为它位于内部开始和内部结束之间,它们位于外部开始和外部之间。
如果我有
一些文字内部开始 文字 - 我想要 内端更多文字外端
然后我不想我希望的文字,因为它虽然介于内部开始和内部之间,没有 outer-start 包围这些字符串。
同样,如果我有
外部开始一些文字文字 - 我想要 内端更多文字外端
然后再次,我不想文本 - 我想要,因为没有封闭的内部开始,虽然有封闭的外部-start 和外端字符串。
假设只有外部开始,内部开始,内部结束和外部结束永远用于封闭/分隔的目的。
我认为我可以通过两次正则表达式匹配来实现这一点,即在外部开始和外部之间查找任何数据,然后在该数据在内部开始和内部结束之间寻找任何文本(如果确实存在这些字符串),但我想知道它是否可以一次完成
答案 0 :(得分:6)
/outer-start.*?inner-start(.*?)inner-end.*?outer-end/
当有多个“我想要的文本”时,您需要使用最小匹配来防止正则表达式引擎出现故障,例如:
“外部开始一些文本内部开始第一个文本 - 我想要内部更多文本外端外部 - 开始一些文本内部 - 开始第二个文本 - 我想要内部结束更多文字外端“
如果没有最小匹配,你将获得令人费解的单一比赛,“第二文本,我想要的”。
。*?表示“吃零个或多个字符,但只有你需要的数量才能使表达式的其余部分匹配。使用?”,只要表达式的其余部分匹配,正则表达式引擎就会吃尽可能多的字符。
答案 1 :(得分:3)
我想你可以做类似的事情:
outer-start .*? inner-start (.*?) inner-end .*? outer-end