首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在lpeg中进行非贪婪搜索而不消耗最终匹配。

在lpeg中进行非贪婪搜索而不消耗最终匹配。
EN

Stack Overflow用户
提问于 2022-01-18 22:27:51
回答 1查看 100关注 0票数 0

这是从this question上的评论中剥离出来的。

据我所知,在聚乙二醇语法中,可以通过编写S <- E2 / E1 S (如果可能的话S=模式E2或模式E1和继续S)来实现非贪婪搜索。

但是,我不想在最后的模式中捕获E2 --我想捕获到E2。当试图在LPEG中实现这一点时,我遇到了几个问题,包括将其构建为语法时出现的“规则中的空循环”错误。

我们如何在LPEG语法中实现以下搜索:[tag] foo [/tag],其中我们希望捕获表中标记的内容(示例中是‘foo’),但是我们希望在结束标记之前终止?正如我从关于另一个问题的评论中了解到的,这应该是可能的,但我在LPEG中找不到一个例子。

下面是测试语法的一个片段

代码语言:javascript
运行
复制
local tag_start = P"[tag]"
local tag_end = P"[/tag]"

G = P{'Pandoc', 
  ...
  NotTag = #tag_end + P"1" * V"NotTag"^0;
  ...
  tag = tag_start * Ct(V"NotTag"^0) * tag_end;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-19 07:45:23

又是我。我认为您需要更好地理解LPeg捕获。表捕获(lpeg.Ct)是在表中收集捕获信息的捕获。由于没有在lpeg.C规则中指定简单捕获( simple capture,lpeg.C),最终捕获将成为空表{}

再次,我建议您从lpeg.re开始,因为它更直观。

代码语言:javascript
运行
复制
local re = require('lpeg.re')
local inspect = require('inspect')

local g = re.compile[=[--lpeg
  tag       <- tag_start {| {NotTag} |} tag_end
  NotTag    <- &tag_end / . NotTag
  
  tag_start <- '[tag]'
  tag_end   <- '[/tag]'
]=]

print(inspect(g:match('[tag] foo [/tag]')))
-- output: { " foo " }

另外,S <- E2 / E1 S不是S <- E2 / E1 S*,这两者不是等价的。

然而,如果我要做同样的任务,我不会尝试使用非贪婪的匹配,因为非贪婪的匹配总是比贪婪的匹配慢。

代码语言:javascript
运行
复制
tag <- tag_start {| {( !tag_end . (!'[' .)* )*} |} tag_end

结合非谓词和贪婪匹配就足够了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70763151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档