首页 > 解决方案 > 在 raku 的语法中使用“之后”作为后视

问题描述

标签: regexgrammarraku

解决方案


当我们使用语法解析字符串时,匹配被锚定到字符串的开头。解析输入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\nin 字符但将其从匹配中排除<(,如前所述。


推荐阅读