regex - Perl 6中的递归正则表达式?

标签 regex raku

我一直在尝试找出如何在Perl 6中执行递归正则表达式。对于一个玩具示例,一个平衡的括号匹配器将匹配((())())中的(((((())())

  • PCRE示例:/\((?R)?\)/
  • Onigmo示例:(?<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/

    相关文章:

    JavaScript 正则表达式?或者其他非常正确的文本输入方法

    用于验证 URL 的 javascript jquery 正则表达式

    raku - 如何在 Perl 6 中连接两组字符串?

    需要 Readline - 您不能创建这种类型的实例 (Readline)

    raku - Perl6 sub MAIN/命令行解析

    python - 正则表达式类型错误 : 'NoneType' object is not callable

    c# - 使用正则表达式 c# 从字符串中删除连续的 <br>

    windows - 在 Windows 中构建 Rakudo 时的警告

    python - python中的正则表达式,匹配html标签之外的词

    raku - Perl 6's uncudled else 是语句分离的特例吗?