【问题标题】:Regex match first group with certain text正则表达式将第一组与某些文本匹配
【发布时间】:2019-05-22 19:29:24
【问题描述】:

我正在尝试匹配其中包含某些文本的文本块。每个块都由标准的开始/结束文本模式明确定义。

在下面的示例中,我想匹配从“step start”到“step end”的第 1 步和第 3 步,因为它们包含文本“database:dev”。但是,我当前的正则表达式可以很好地匹配第 1 步,但随后会在单个匹配中匹配第 2 步和第 3 步。通过此处的示例可能更容易看到:https://regex101.com/r/56tfOQ/3/

我需要指定每个匹配项只能包含一个“步骤开始”,但我不知道该怎么做。

我目前使用的正则表达式是:

(?msi)step start.*?database:dev.*?step end

文本示例如下:

step start
    name:step1
    database:dev1
step end
step start
    name:step2
    database:test1
step end
step start
    name:step3
    database:dev2
step end
step start
    name:step4
    database:test2
step end

【问题讨论】:

    标签: regex


    【解决方案1】:

    在常见情况下,您可以在起始分隔符和应该出现在分隔符之间的第三个字符串之间使用tempered greedy token,例如(?:(?!<STOP_PATTERN>).)*?

    你可以把你的正则表达式写成

    (?si)step start(?:(?!step start).)*?database:dev.*?step end
    

    但是,您的开始分隔符似乎位于行首。那么使用就有意义了

    (?msi)^step start(?:(?!^step start).)*?database:dev.*?step end
    

    regex demo

    正则表达式图:

    详情

    • (?msi) - 多行、dotall 和不区分大小写模式已开启
    • ^ - 行开始(因为m 选项已打开)
    • step start - 起始分隔符
    • (?:(?!^step start).)*? - tempered greedy token 匹配任何字符,0+ 次出现/重复,尽可能少,不会在行首开始 step start 字符序列
    • database:dev - 文字子串
    • .*? - 任何 0+ 个字符,尽可能少
    • step end - 结束分隔符。

    【讨论】:

    • 完美!谢谢。我试过 (?msi)step start(?:(?!step start)).*?database:dev.*?step end ,在某一时刻。现在我需要弄清楚为什么捕获组内部的点与外部的点会有所不同!再次感谢
    • @mjharper 这里没有捕获组。 (?:(?!...).)*? 中的点是tempered greedy token 的一部分,在我的其他答案中对此进行了很好的描述。我添加了更多细节。
    • 对不起 - 我的意思是非捕获组!将阅读您的其他答案。再次感谢。
    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多