regex - 在 raku 的语法中使用“之后”作为后视
问题描述
解决方案
当我们使用语法解析字符串时,匹配被锚定到字符串的开头。解析输入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
in 字符但将其从匹配中排除<(
,如前所述。
推荐阅读
- c++ - 对 const c 数组副本的结构化绑定应该是 const 吗?
- google-chrome-extension - 我可以在 Browserstack 上运行时添加 Chrome 扩展吗?
- protocol-buffers - 在协议缓冲区中替换具有相同类型但含义不同的字段
- angular - Angular 2输入范围最小可变参数
- xml - XSLT For-Each 只选择第一个元素
- php - Eloquent - 由于列转换类型,通过关系删除行失败。如何强制转换类型?
- laravel - 无法使用 Nginx 远程服务器接收来自 PUT 和 DELETE 方法的响应
- wordpress - 在 wordpress 网站上创建一个外部链接,将用户名作为查询字符串参数传递
- php - 在 PHP 中有或没有 $this
- php - Wordpress 插件 - 未找到选项页面