LPeg中如何同时实现外层捕获与内部命名捕获?
解决LPeg同时捕获完整子串与命名字母的问题
你的问题出在外层的C捕获会将内部所有嵌套捕获合并为单一字符串,导致Cg的命名捕获无法被Ct收集——因为Ct只会处理顶级的捕获项,嵌套在C里的命名捕获会被覆盖。
要同时获取完整子串和单独字母的命名捕获,只需用Cg嵌套实现:外层Cg捕获整个匹配内容并命名,内层Cg单独捕获字母,这样Ct会将两个命名项都存入结果表。
示例代码
local lpeg = require 'lpeg' -- 同时捕获完整子串(命名为full)和单独字母(命名为letter) local pat = lpeg.Ct( lpeg.Cg( (lpeg.P" ")^0 * lpeg.Cg(lpeg.C(lpeg.R"az"), "letter") * lpeg.P".", "full" ) ) local result = lpeg.match(pat, " a.") -- 输出结果:{ full = " a.", letter = "a" }
原理说明
- 外层
lpeg.Cg(..., "full"):把整个匹配的内容(前置空格+字母+点)作为命名捕获full。 - 内层
lpeg.Cg(lpeg.C(lpeg.R"az"), "letter"):在匹配过程中单独捕获字母,命名为letter。 Ct会将这两个命名捕获全部收集到结果表中,直接通过键名即可访问对应值,无需额外反向提取操作。
内容的提问来源于stack exchange,提问作者MrMobster
相关产品推荐
相关产品推荐

