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

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

所涉及的字符串总是在一个名为TRANS的JUCE宏之前。以下是一些应该提取字符串的示例

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

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

就模式匹配而言,我已经做到了这一步。我已经将源代码转换为lua字符串

path = ...

--打开文件并将源码读入字符串
文件= io.open(path,"r")
str=文件:read("*全部")

并调用

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个或多个空格,最后以)结束。不幸的是,当使用时,它没有返回单个值。但是...我认为即使它按照我期望的工作,也可能有一个\"在里面,这会导致括号不平衡。

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

原文链接 https://stackoverflow.com/questions/6576769

点赞
stackoverflow用户107090
stackoverflow用户107090

在第二种情况下,您忘记了转义括号。尝试使用下面的代码:

for word in string.gmatch(str, 'TRANS%s*%(%s*(%b"")%s*%)') do print(word) end
2011-07-05 00:35:26
stackoverflow用户41661
stackoverflow用户41661

我和其他人一样喜欢 Lua 模式,但这不是一个适合使用正则表达式解决的问题。为了正确处理双引号和反斜杠转义,你需要一个真正的解析器,LPEG可以完美地满足你的需求。

2011-07-05 02:18:18