【问题标题】:PCRE regex - how to capture first match from lines above the pattern?PCRE 正则表达式 - 如何从模式上方的行中捕获第一个匹配项?
【发布时间】:2020-10-09 19:23:13
【问题描述】:

我在一个文件中有以下文本:

mysql_databases:
  potato_mychat1:
    - potato_mychat1
  potato_phpb1:
    - potato_phpb1
    - potato_smf1
  potato_phpb2:
    - potato_phpb2
  p_phpb282:
    - potato_phpb282
  potato_registry:
    - potato_registryadmi
  potato_smf1:
    - potato_smf1
  potato_smf2:
    - potato_smf2
  potato_wp82:
   - potato_wp82

模式是- potato_smf1。

应标记每个匹配项上方以 : 结尾的第一个字符串 - 因此在本例中为 potato_phpb1: 和 potato_smf1:。

我尝试了许多积极的后视方法:(?<= - potato_smf)*:,但无论如何都无法做到,我将不胜感激。

【问题讨论】:

  • 这样的作品,谢谢,但是,它只是标记从底部开始的第一场比赛,它没有标记potato_phpb1
  • 如果我的回答不能帮助您解决问题,请考虑更新问题。

标签: regex pcre


【解决方案1】:

假设你可以依赖缩进,你可以使用

(?m)^\h{2}\S.*(?=(?:\R\h{4}.*)*?\R\h{4}- potato_smf1)

见regex demo

详情

  • (?m)^ - 行首
  • \h{2} - 两个水平空格
  • \S.* - 一个非空格,然后是除换行符以外的任何 0 个或多个字符,尽可能多
  • (?=(?:\R\h{4}.*)*?\R\h{4}- potato_smf1) - 一个积极的前瞻,需要,立即在右边,
    • (?:\R\h{4}.*)*? - 零个或多个,但尽可能少,重复一个换行符,四个水平空格,然后是零个或多个除换行符之外的字符,尽可能多
    • \R - 换行符
    • \h{4} - 四个水平空格
    • - potato_smf1 - 文字文本。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 2018-12-30
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多