棘轮运动会影响嵌套结构和“节俭的修饰符”吗?

时间:2019-04-08 09:18:16

标签: regex perl6 ratchet

在Perl 6中,可以使用波浪号运算符来嵌套结构。 棘轮运动显然会影响嵌套结构的工作方式。

此案例不使用棘轮操作

$ perl6 -e "say '{hello} aaa }' ~~ / '{' ~ '}' ( .+? ) /"
「{hello}」
 0 => 「hello」

这样做的时候:

$ perl6 -e"say '{hello} aaa }' ~~ / :r '{' ~ '}' ( .+? ) /"
Nil

通过将.+?模式更改为更具体的<-[}]> +,可以得到期望的结果:

$ perl6 -e"say '{hello} aaa }' ~~ / :r '{' ~ '}' ( <-[}]> + ) /"
「{hello}」
 0 => 「hello」

但是我不知道为什么“节俭量词”不能使用棘轮功能工作。 有想法吗?

(使用rakudo 2019.03.1)

1 个答案:

答案 0 :(得分:9)

:ratchet regex adverb禁止引擎回溯到量化的子模式。

第一个/ :r '{' ~ '}' ( .+? ) /模式意味着.+?模式在匹配任何一个或多个字符后,将尽可能少地对它进行测试,并在随后的模式失败时重新输入

在您的{hello} aaa }示例中,在测试{之后,.+?匹配了h,然后}未能匹配e 。由于不允许回溯,所以匹配失败,并且下一次迭代开始:h已针对{进行了测试,但失败,等等。

使用第二个正则表达式<-[}]> +的原因是,它匹配} 以外的任何1个以上的字符,这是与.+?可能匹配的关键区别},并且必须消耗至少1个字符(由于+)。因此,它无法消耗}并找到匹配项。