如何在正则表达式子程序中访问捕获组?

5

我有一个模式,想在几个地方使用它,但我想要访问模式的内部部分。有什么方法可以做到这一点吗?

在这个简化的例子中:

(?(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块内部的捕获组只能在该块内部“可见”,无法从模式中访问。 - Wiktor Stribiżew
如果你的工具/语言支持呼叫机制,你或许可以通过黑客手段实现这个功能,但是你也会得到来自失败分支的结果。 - Lucas Trzesniewski
1个回答

2
DEFINE块中的捕获组只能在该块内部“可见”,无法从模式中访问。请参阅此perlre参考文献:这允许定义仅由递归机制执行的子模式...请注意,在递归中匹配的捕获组在递归返回后不可访问,因此需要额外的捕获组层。最后,请记住,在DEFINE块中创建的子模式计入绝对和相对捕获数。因此,即使您有3个命名捕获组,您也只能访问在主模式中定义的test组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接