如何在lua中捕获平衡字符串内的表达式匹配

时间:2013-09-18 13:15:26

标签: lua pattern-matching capture gsub

我想在lua中使用gsub来转换表达式,如下所示:

MACRO(part1, part2)

在此:

part1SOMETHINGpart2

SOMETHING取决于part1part2

所以我可以使用类似的东西:

line = (string.gsub(line, "MACRO%((.-), *(.-)%)", "%1SOMETHING%2"))

并将该线相乘以在捕获的两个部分上设置一些条件,以处理不同的情况。

问题是part1或part2可以包含宏:

MACRO(MACRO(a,b),c)

所以上面的表达式与良好的括号不匹配......

我知道在lua中有可能将平衡的括号与%b()匹配,但据我所知,我们不能在内部放置条件,我们不能像上面那样使用捕获。

你知道如何实现我想做的事吗?

1 个答案:

答案 0 :(得分:1)

您需要进行所有替换:

local oldline,line
line=[[
MACRO(MACRO(a,b),c)
]]
repeat
    oldline,line=line,line:gsub("MACRO%((.-), *(.-)%)", "%1SOMETHING%2")
until oldline==line
print(line)

然而,这是一个黑客攻击,因为尽管有外观,它不会以正确的顺序扩展宏,因为它没有真正正确地识别宏调用和参数。

由于line中的表达式是有效的Lua代码,请尝试此解决方案,该解决方案将按预期执行,因为Lua解析器将执行所有艰苦的工作:

a="A"; b="B"; c="C"
function MACRO(a,b) return "["..a..","..b.."]" end
line=[[
MACRO(MACRO(a,b),c)
]]
print(load("return "..line)())

当然,根据需要定义MACRO