棘轮效应是否会影响嵌套结构和 "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 个字符(由于 +
)。因此,它无法使用 }
并找到匹配项。
在 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 个字符(由于 +
)。因此,它无法使用 }
并找到匹配项。