在语法中§

请参阅 上下文中的主要文档 了解命名正则表达式

语法的核心成分是命名的 正则表达式。虽然 Raku 正则表达式 的语法超出了本文档的范围,但命名正则表达式具有特殊的语法,类似于子例程定义:[1]

my regex number { \d+ [ \. \d+ ]? }

在这种情况下,我们必须使用 my 关键字指定正则表达式是词法作用域的,因为命名正则表达式通常在语法中使用。

命名使我们能够轻松地在其他地方重新使用正则表达式

say so "32.51" ~~ &number;                         # OUTPUT: «True␤» 
say so "15 + 4.5" ~~ /<number>\s* '+' \s*<number>/ # OUTPUT: «True␤» 

regex 并不是命名正则表达式的唯一声明符。事实上,它是最不常用的。大多数情况下,使用 tokenrule 声明符。这两个都是棘轮,这意味着如果匹配失败,匹配引擎不会备份并重试。这通常会执行您想要的操作,但并不适用于所有情况

my regex works-but-slow { .+ q }
my token fails-but-fast { .+ q }
my $s = 'Tokens won\'t backtrack, which makes them fail quicker!';
say so $s ~~ &works-but-slow# OUTPUT: «True␤» 
say so $s ~~ &fails-but-fast# OUTPUT: «False␤» 
                              # the entire string is taken by the .+ 

请注意,非回溯适用于术语,即,如下面的示例所示,如果您匹配了某项内容,则永远不会回溯。但是,当您匹配失败时,如果 ||| 引入了另一个候选项,您将重试以再次匹配。

my token tok-a { .* d  };
my token tok-b { .* d | bd };
say so "bd" ~~ &tok-a;        # OUTPUT: «False␤» 
say so "bd" ~~ &tok-b;        # OUTPUT: «True␤»