gpt4 book ai didi

regex - 在Raku的语法中使用 'after'

转载 作者:行者123 更新时间:2023-12-03 16:30:31 30 4
gpt4 key购买 nike

我正在尝试在Raku语法中进行匹配,并且以“after”失败。我将问题归结为以下代码段:

grammar MyGrammar {

token TOP {
<character>
}

token character {
<?after \n\n>LUKE
}
}

say MyGrammar.subparse("\n\nLUKE");
这会将 #<failed match>返回为MyGrammar.subparse,将 Nil返回为MyGrammar.parse。
但是,如果我在REPL中进行比赛: "\n\nLUKE" ~~ /<?after \n\n>LUKE/我得到匹配 「LUKE」所以有些事情我不了解,我不确定。有指针吗?

最佳答案

当我们使用语法解析字符串时,匹配项将 anchor 定到字符串的开头。使用parse解析输入需要我们消耗所有字符串。还有一个subparse,它允许我们不使用所有输入,但仍固定在字符串的开头。
相比之下,像/<?after \n\n>LUKE/这样的正则表达式将扫描字符串,尝试匹配字符串中每个位置的模式,直到找到匹配的位置(或到达字符串的末尾并放弃)。这就是为什么它起作用。但是请注意,如果您的目标是不捕获\n\n,则可以将正则表达式写为/\n\n <( LUKE/,其中<(指示从何处开始捕获。至少在当前的Rakudo编译器实现上,这种方式更有效。
建议如何在没有更多上下文的情况下编写语法就不容易了(我猜这是从一个更大的问题中提取出来的)。例如,您可以在语法开始时使用空格:

grammar MyGrammar {

token TOP {
\s+ <character>
}

token character {
<?after \n\n>LUKE
}
}

say MyGrammar.subparse("\n\nLUKE");
或者使用字符中的 \n\n,但将其从 <(的匹配项中排除,如前所述。

关于regex - 在Raku的语法中使用 'after',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62686065/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com