在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)
答案 0 :(得分:9)
:ratchet
regex adverb禁止引擎回溯到量化的子模式。
第一个/ :r '{' ~ '}' ( .+? ) /
模式意味着.+?
模式在匹配任何一个或多个字符后,将尽可能少地对它进行测试,并在随后的模式失败时重新输入
在您的{hello} aaa }
示例中,在测试{
之后,.+?
匹配了h
,然后}
未能匹配e
。由于不允许回溯,所以匹配失败,并且下一次迭代开始:h
已针对{
进行了测试,但失败,等等。
使用第二个正则表达式<-[}]> +
的原因是,它匹配}
以外的任何1个以上的字符,这是与.+?
可能匹配的关键区别}
,并且必须消耗至少1个字符(由于+
)。因此,它无法消耗}
并找到匹配项。