棘轮效应是否会影响嵌套结构和 "frugal quatifiers"?

Does ratcheting affect nesting structures and "frugal quatifiers"?

在 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」

但我不知道为什么 "frugal quantifier" 不能使用棘轮。 有什么想法吗?

(使用 rakudo 2019.03.1)

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

第一个/ :r '{' ~ '}' ( .+? ) /模式是指.+?模式在匹配任意1个或多个字符后,尽量少,不再重测,后续重入模式失败。

在这里,在您的 {hello} aaa } 示例中,在测试 { 之后,.+? 匹配 h,然后 } 无法匹配 e.由于不允许回溯,因此匹配失败并开始下一次迭代:h 测试 {,但失败,等等

带有 <-[}]> + 的第二个正则表达式有效,因为它匹配除 } 之外的任何 1+ 个字符 ,这是与 [=12] 的关键区别=] 可以匹配 } 并且强制消耗至少 1 个字符(由于 +)。因此,它无法使用 } 并找到匹配项。