代码之家  ›  专栏  ›  技术社区  ›  Julio

Raku regex:最长令牌匹配不一致

  •  1
  • Julio  · 技术社区  · 5 年前

    Raku的regex预计将匹配longest令牌。

    事实上,这种行为在这段代码中可以看到:

    raku -e "'AA' ~~ m/A {say 1}|AA {say 2}/"
    # 2
    

    但是,当文本位于变量中时,它的工作方式似乎不同:

    raku -e "my $a = 'A'; my $b = 'AA'; 'AA' ~~ m/$a {say 1}|$b {say 2}/"
    # 1
    

    1 回复  |  直到 5 年前
        1
  •  2
  •   Jonathan Worthington    5 年前

    这里有两件事在起作用。

    首先是“最长令牌”的含义。当有替换时(使用 | 或暗示使用 proto 声明性前缀 提取每个分支的。声明性是指可以通过 finite state machine read more and find some further references in the docs .

    其次,Raku regex是主Raku语言中的一种嵌套语言,在一个过程中对其进行解析并同时进行编译。(这与大多数语言不同,regex是作为一个库提供的,我们将字符串传递给它。)最长的令牌计算发生在编译时。但是,变量是在运行时插值的。因此,regex中的变量插值是非声明性的,因此不被视为最长令牌匹配的一部分。