【问题标题】:Backref before associated group关联组之前的反向引用
【发布时间】:2019-04-21 21:37:04
【问题描述】:

在带有反向引用的扩展正则表达式中,在关联组之前有反向引用是否有效?

例如,\1(a) 模式是否有意义,它匹配什么?

【问题讨论】:

  • 你试过了吗?
  • 如果不在重复组中就没有意义了。如果不在支持前向引用的正则表达式引擎中使用它也没有意义。
  • @miken32 - 我尝试了各种实现,但没有找到任何一致的模式。
  • 当然不能与 PCRE 一起使用,正如 revo 所说,那样写模式没有任何意义。
  • @miken32 - 同意。但问题是/应该是什么行为?例如,如果您正在编写正则表达式引擎,您是否应该在编译时拒绝此类模式?他们是否应该被接受但从不匹配任何东西?是否应该将 backref 视为空字符串,因此此模式将匹配 a?也有人提到了我一无所知但可能相关的“前向引用”。

标签: regex regex-group backreference


【解决方案1】:

单独的正则表达式\1(a) 不会产生支持forward referencing 的正则表达式风格的匹配。为什么?因为尚未处理引用的捕获组。但它们在量化集群中使用时意味着一些东西,例如(...)+。使用前向引用的一个实际用法是尝试matching nested brackets

如果您正在编写正则表达式引擎,您是否应该在编译时拒绝此类模式?他们是否应该被接受但从不匹配任何东西?

对此没有绝对的答案。 JavaScript 不支持前向引用,但它也不抱怨它。它改为匹配零长度位置。 Boost 引擎抛出错误,PCRE 以另一种方式处理它。

是否应该将 backref 视为空字符串,因此此模式将匹配 a

JS 就是这样。事实上,没有为此类行为定义标准。有时有人决定在自己的风格中实现所有引擎特性。

【讨论】:

    【解决方案2】:

    \1(a) is valid,但它可能不会返回任何内容。有些语句有时可以很好地用于实现特定技巧,但可能不会用于它们的原始目的。

    (?:\1(a)|(a))
    

    This RegEx 可能是一个粗略的例子:

    \??
    

    【讨论】:

    • 请注意,第一个示例(?:\1(a)|(b)) 在图片中有所不同(它有(?:\1(a)|(a)))。我不清楚\1 是否在那里完成了什么?是否等同于(?:(a)|(b))(即,简单地删除backref)?
    猜你喜欢
    • 2010-11-26
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多