正则表达式将第一组与某些文本匹配

时间:2019-05-22 19:29:24

标签: regex

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

在下面的示例中,我想将步骤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

1 个答案:

答案 0 :(得分:2)

在常见情况下,您可以在起始定界符和应该出现在定界符之间的某些第三字符串之间使用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

正则表达式图:

enter image description here

详细信息

  • (?msi)-启用多行,dotall和不区分大小写的模式
  • ^-行开始(由于m选项处于启用状态)
  • step start-起始定界符
  • (?:(?!^step start).)*?-一个tempered greedy token,它与任何char匹配,且出现次数/重复次数尽可能少,且不会在行的开头开始step start char序列< / li>
  • database:dev-文字子字符串
  • .*?-任意0个以上的字符,尽可能少
  • step end-结束定界符。