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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (7)

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

在下面的例子中,我想将步骤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
提问于
用户回答回答于

在普通情况下,您可以使用强化贪婪的令牌一样(?:(?!<STOP_PATTERN>).)*?在开始分隔符和一些应该分隔符之间会出现在第三个字符串之间。

你可以写你的正则表达式

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

但是,您的开头分隔符似乎在一行的开头。然后使用它是有道理的

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

请参阅正则表达式演示

正则表达式图:

细节

  • (?msi) - 启用多行,dotall和不区分大小写的模式
  • ^- 行开始(因为m选项已启用)
  • step start - 开始分隔符
  • (?:(?!^step start).)*?- 一个调和的贪婪令牌,匹配任何char,0 +出现/重复,尽可能少,不会step start在行的开头启动char序列
  • database:dev - 一个文字子串
  • .*? - 任何0+字符,尽可能少
  • step end - 结束分隔符。

扫码关注云+社区

领取腾讯云代金券