这是从this question上的评论中剥离出来的。
据我所知,在聚乙二醇语法中,可以通过编写S <- E2 / E1 S (如果可能的话S=模式E2或模式E1和继续S)来实现非贪婪搜索。
但是,我不想在最后的模式中捕获E2 --我想捕获到E2。当试图在LPEG中实现这一点时,我遇到了几个问题,包括将其构建为语法时出现的“规则中的空循环”错误。
我们如何在LPEG语法中实现以下搜索:[tag] foo [/tag],其中我们希望捕获表中标记的内容(示例中是‘foo’),但是我们希望在结束标记之前终止?正如我从关于另一个问题的评论中了解到的,这应该是可能的,但我在LPEG中找不到一个例子。
下面是测试语法的一个片段
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;
}发布于 2022-01-19 07:45:23
又是我。我认为您需要更好地理解LPeg捕获。表捕获(lpeg.Ct)是在表中收集捕获信息的捕获。由于没有在lpeg.C规则中指定简单捕获( simple capture,lpeg.C),最终捕获将成为空表{}。
再次,我建议您从lpeg.re开始,因为它更直观。
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*,这两者不是等价的。
然而,如果我要做同样的任务,我不会尝试使用非贪婪的匹配,因为非贪婪的匹配总是比贪婪的匹配慢。
tag <- tag_start {| {( !tag_end . (!'[' .)* )*} |} tag_end结合非谓词和贪婪匹配就足够了。
https://stackoverflow.com/questions/70763151
复制相似问题