在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)
最佳答案
:ratchet
regex adverb禁止引擎回溯到量化的子模式。
第一个/ :r '{' ~ '}' ( .+? ) /
模式意味着.+?
模式在匹配任何1个或多个字符后(尽可能少),将不会被重新测试,并在随后的模式失败时重新输入。
在这里,以您的{hello} aaa }
示例为例,在测试{
之后,.+?
匹配h
,然后}
不能匹配e
。由于不允许回溯,所以匹配失败并且下一次迭代开始:h
被测试用于{
,但失败,依此类推。
第二个带有<-[}]> +
的正则表达式起作用是因为它匹配除}
以外的任何1+个字符,这是与.+?
的关键区别,可以匹配}
并强制消耗至少1个字符(由于+
)。因此,它不能使用}
并找到匹配项。