Lua模式匹配用于提取代码库中的硬编码字符串

时间:2011-07-04 23:13:58

标签: c++ lua juce

我正在使用C ++代码库。现在我正在使用一个C ++代码调用lua脚本来查看整个代码库,并希望返回程序中使用的所有字符串的列表。

有问题的字符串前面总是有一个名为TRANS的JUCE宏。以下是一些应该提取字符串的示例

TRANS("Normal")
TRANS ( "With spaces" )
TRANS("")
TRANS("multiple"" ""quotations")
TRANS(")")
TRANS("spans \
multiple \
lines")

我确信您可以想象一些可能在大型代码库中出现的其他可能的字符串变量。我正在制作一个自动工具来生成JUCE翻译格式的文件,以尽可能自动化该过程

为了找到这些字符串,我已经完成了模式匹配。我已将源代码转换为lua字符串

path = ...

--Open file and read source into string
file = io.open(path, "r")
str = file:read("*all")

并致电

for word in string.gmatch(string, 'TRANS%s*%b()') do print(word) end

找到以TRANS开头的模式,具有平衡括号。这将获得完整的宏,包括括号,但从那里我认为分离我不需要的脂肪并保持实际的字符串值非常容易。

然而,这对于导致括号不平衡的字符串不起作用。 例如TRANS(")")将返回TRANS("),而不是TRANS("(")

我将模式修改为

for word in string.gmatch(string, 'TRANS%s*(%s*%b""%s*') do print(word) end

其中,模式应以TRANS开头,然后是0或许多空格。然后它应该有一个(字符后跟零或多个空格。现在我们在括号内,我们应该有一个平衡数量的“”标记,然后是另一个0或许多空格,最后以a结尾)。不幸的是,这在使用时不会返回单个值。但是......我认为即使它像我预期的那样工作......内部可能有一个\",这会导致支架不平衡。

有关提取这些字符串的任何建议吗?我应该继续尝试找到模式匹配序列吗?或者我应该尝试直接算法...你知道为什么我的第二个模式没有返回任何字符串吗?任何其他建议!我不打算100%覆盖所有可能性,但接近100%将是非常棒的。谢谢! :d

2 个答案:

答案 0 :(得分:1)

我和任何人一样喜欢Lua模式,但是你带着一把刀进行枪战。这是您真正不希望将解决方案编码为正则表达式的问题之一。要正确处理双引号和反斜杠转义,您需要一个真正的解析器,而LPEG可以很好地管理您的需求。

答案 1 :(得分:0)

在第二种情况下,你忘了逃避括号。尝试

for word in string.gmatch(str, 'TRANS%s*%(%s*(%b"")%s*%)') do print(word) end