【问题标题】:Regex matching pattern in multiple lines without specific word in the match多行中的正则表达式匹配模式,匹配中没有特定单词
【发布时间】:2021-12-02 02:50:46
【问题描述】:

我想多行匹配下面的模式

  1. 模式以“PAT_A”开头
  2. 模式以第一个“;”结尾在“PAT_A”之后
  3. 模式在“PAT_A”和“;”之间包含“PAT_B”
  4. 模式在“PAT_A”和“;”之间不包含“NOT_MATCH_THIS”

例如,这应该匹配

PAT_A_YYY(
  OK,
  PAT_B
);

这不应该匹配。

PAT_A_XXX(
  NOT_MATCH_THIS,
  PAT_B
);

我设法满足了前三个要求

(PAT_A[^;]*?)(\bPAT_B\b)([^;]*;)

这些组用于提取匹配的不同部分。

但是,我没有成功排除包含“NOT_MATCH_THIS”的匹配项。

我查看了关于负前瞻的帖子“How to negate specific word in regex?”。但是,那里的答案似乎与整行匹配,而不是上述模式要求。而且我不确定如何将负前瞻纳入我的正则表达式模式。

我有什么方法可以匹配满足所有四个要求的正则表达式?

【问题讨论】:

    标签: regex regex-negation multiline


    【解决方案1】:

    你可能会使用

    ^PAT_A[^;\n]*(?:\n(?![^\n;]*NOT_MATCH_THIS)[^;\n]*)*\n[^;\n]*PAT_B[^;]*;
    

    部分模式匹配:

    • ^ 字符串开始
    • PAT_A 字面匹配
    • [^;\n]* 可以选择匹配除; 或换行符以外的任何字符
    • (?:非捕获组(整体重复)
      • \n(?![^\n;]*NOT_MATCH_THIS) 匹配换行符,并断言该字符串不包含 NOT_MATCH_THIS 并且不包含 ; 或换行符以保持在同一行
      • [^;\n]* 如果前面的断言为真,则匹配整行(不包含;
    • )*关闭非捕获组,可选择重复匹配所有行
    • \n[^;\n]* 匹配换行符,以及除; 或换行符之外的任何字符
    • PAT_B[^;]*; 然后匹配 PAT_B 后跟除 ; 之外的任何字符,然后匹配 ;

    Regex demo

    【讨论】:

      【解决方案2】:

      我手边没有 RegEx 解释器,但你可以试试这个:

      (PAT_A[^;]*?(?!NOT_MATCH_THIS))(\bPAT_B\b)([^;]*;)
      

      或许:

      (PAT_A[^;]*?(?!NOT_MATCH_THIS)[^;]*?)(\bPAT_B\b)([^;]*;)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 2013-02-08
        • 2013-06-10
        • 2016-03-02
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        相关资源
        最近更新 更多