代码之家  ›  专栏  ›  技术社区  ›  Tola Odejayi

使用regex匹配两个字符串之间的字符串

  •  3
  • Tola Odejayi  · 技术社区  · 15 年前

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

    例如,我有以下文本:

    外启动 一些文本 内启动 我想要的文本 内端 更多的文本 外端

    在这种情况下,我想 我想要的文本 因为它介于 内部启动 内端 它们自己介于 外启动 外端 .

    如果我有

    一些文本 内启动 我想要的文本 内端 更多的文本 外端

    那我就不想了 我想要的文本 因为尽管它介于 内启动 内端 没有 外部启动 包含这些字符串。

    同样,如果我有

    外启动 一些文本 我想要的文本 内端 更多的文本 外端

    再说一遍,我不想 我想要的文本 ,因为没有封闭 内启动 ,尽管有 外启动 外端 串。

    假设 外启动 , 内启动 , 内端 外端 仅用于封闭/定界。

    我认为我可以通过进行两遍正则表达式匹配来实现这一点,即查找 外启动 外端 ,然后在该数据中查找 内启动 内端 (如果确实存在这些字符串),但我想知道是否可以一次性完成。

    2 回复  |  直到 15 年前
        1
  •  6
  •   Wayne Conrad    15 年前
    /outer-start.*?inner-start(.*?)inner-end.*?outer-end/
    

    当存在多个“texts-that-i-want”时,您需要使用最小匹配来防止regexp引擎出现故障,例如:

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

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

    *?意思是“吃零个或多个字符,但只需要使表达式的其余部分匹配所需的数量。与?,只要表达式的其余部分匹配,regexp引擎将吃掉尽可能多的字符。

        2
  •  3
  •   Ben McCann    15 年前

    我想你可以做如下的事情:

    
    outer-start .*? inner-start (.*?) inner-end .*? outer-end
    
    推荐文章