我正在尝试匹配其中包含某些文本的文本块。每个块均由标准的开始/结束文本模式明确定义。
在下面的示例中,我想将步骤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
答案 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
正则表达式图:
详细信息
(?msi)
-启用多行,dotall和不区分大小写的模式^
-行开始(由于m
选项处于启用状态)step start
-起始定界符(?:(?!^step start).)*?
-一个tempered greedy token,它与任何char匹配,且出现次数/重复次数尽可能少,且不会在行的开头开始step start
char序列< / li>
database:dev
-文字子字符串.*?
-任意0个以上的字符,尽可能少step end
-结束定界符。