【问题标题】:How to access the capture group in a regex subroutine?如何在正则表达式子例程中访问捕获组?
【发布时间】:2016-05-22 04:16:34
【问题描述】:

我有一个想在几个地方使用的模式,但我想访问该模式的内部部分。有没有办法做到这一点?

在这个简化的例子中:

(?(DEFINE)
    (?<_isa_> \s+ (?<isa> is \s+ a) \s+ )
)
this (?&_isa_) (?<test>test)

当正则表达式成功时,我希望能够访问命名组isa 中匹配的捕获字符串,而不必像这样拉出周围的\s+

(?(DEFINE)
    (?<_isa_> is \s+ a )
)
this \s+ (?<isa>(?&_isa_)) \s+ (?<test>test)

因为,这基本上意味着每次我想在我的实际正则表达式中执行此操作时,我都必须指定预子匹配、子匹配和后子匹配,这不是我想要的。

【问题讨论】:

  • 不可能,DEFINE 块内的捕获组仅在该块内“可见”,无法从模式访问。
  • 如果您的工具/语言暴露了这种情况,您可能可以使用标注机制破解某些东西,但您也会从失败的分支中获得结果。

标签: regex pcre


【解决方案1】:

这是不可能的,因为 DEFINE 块内的捕获组仅在该块内“可见”,并且无法从模式中访问。

看到这个perlre reference

这允许定义仅由递归机制执行的子模式... 请注意,递归内部匹配的捕获组在递归返回后无法访问,因此额外的捕获组层是必要的 ... 最后,请记住,在 DEFINE 块内创建的子模式计入绝对和相对捕获数。

因此,即使您有 3 个命名的捕获组,您也只能访问在主模式中定义的 test 组。

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多