我一直在尝试找出如何在Perl 6中执行递归正则表达式。对于一个玩具示例,一个平衡的括号匹配器将匹配((())())
中的(((((())())
。
/\((?R)?\)/
(?<paren>\(\g<paren>*\))
我以为这样可以做到:
my regex paren {
'(' ~ ')' <paren>*
}
或更简单
my regex paren {
'(' <paren>* ')'
}
但这失败了
No such method 'paren' for invocant of type 'Match'
in regex paren at ...
最佳答案
您需要明确表明您正在调用my
范围的正则表达式:
my regex paren {
'(' ~ ')' <&paren>*
}
请注意已添加的
&
。接着就,随即:say "(()())" ~~ /^<&paren>$/ # 「(()())」
say "(()()" ~~ /^<&paren>$/ # Nil
的确,有时您可以不用显式地编写
&
而逃脱,并且在使用时确实可以:say "(()())" ~~ /^<paren>$/ # 「(()())」
say "(()()" ~~ /^<paren>$/ # Nil
这仅是有效的,因为编译器会发现在词法范围内定义了一个名称为
paren
的正则表达式,因此将<paren>
语法编译为该正则表达式。在递归的情况下,直到解析正则表达式后才安装该声明,因此需要明确声明。
关于regex - Perl 6中的递归正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54940877/