【问题标题】:Is it possible to define a pattern and reuse it to capture multiple groups?是否可以定义一个模式并重用它来捕获多个组?
【发布时间】:2017-06-12 05:57:23
【问题描述】:

是否可以定义一次模式的一部分,然后命名它,以便它可以在主模式中多次重用,而不必再次写出来?

要画一幅画,我的模式看起来类似于这个(伪正则表达式模式)

(PAT),(PAT), ... ,(PAT)

PAT 是一些冗长的模式。

要求

  1. 不必重复该模式,因为它的长度会成为问题(目前,Notepad++ 在使用正则表达式时只允许搜索框中包含 2047 个字符,我很容易超过这个限制)
  2. 每个捕获组应该能够独立于其同级进行匹配。例如,假设我的模式是([a-z]),([a-z]),([a-z]),那么a,a,aa,b,c 应该匹配

我已经研究过命名第一个捕获组,然后在随后的捕获组中引用它,但这种方法违反了第二个要求(即,它无法匹配 a,b,c)。是否有直接或间接的方式来仅使用正则表达式来满足这两个要求?

我的最终目标是能够获取和访问每个捕获组的值,以便稍后在搜索和替换框的“替换”部分操作每个组。

【问题讨论】:

    标签: regex notepad++ pcre


    【解决方案1】:

    要重用一个模式,您可以使用(?n),其中n 是要重复的组号。例如,您的实际模式:

    (PAT),(PAT), ... ,(PAT)
    

    可以替换为:

    (PAT),(?1), ... ,(?1)
    

    (?1)(PAT)whatever PAT 的模式相同。

    您可能有多种模式:

    (PAT1),(PAT2),(PAT1),(PAT2),(PAT1),(PAT2),(PAT1),(PAT2)
    

    可以简化为:

    (PAT1),(PAT2),(?1),(?2),(?1),(?2),(?1),(?2)
    

    或:

    ((PAT1),(PAT2)),(?1),(?1),(?1)
    

    或:

    ((PAT1),(PAT2)),(?1){3}
    

    【讨论】:

    • 完美,谢谢!作为旁注,我必须将引用 (?n) 括在额外的括号中,以便稍后在替换部分中访问它们。模式最终为 (PAT),((?1)), ... ,((?1))
    • 这在javascript中也可以吗?
    • @AdrianMoisa 这在 JS 中是不可能的,只有 PCRE 兼容的正则表达式才有可能(Python PyPi regex 模块复制了它)。 \g<n> 也在 PCRE 和 Onigmo/Oniguruma (Ruby) 工作。
    • 如果像(?:)这样的非捕获组,是否可以重用组?
    • @NicholasVasilaki:不,不是。只有当它是捕获组时,您才能重用组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 2014-07-24
    • 2014-05-03
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多