2

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

有问题的字符串前面总是有一个名为 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

4

2 回答 2

1

我和其他人一样喜欢 Lua 模式,但你是在把刀带到枪战中。这是您真的不想将解决方案编码为正则表达式的问题之一。要正确处理双引号和反斜杠转义,您需要一个真正的解析器,而LPEG将很好地满足您的需求。

于 2011-07-05T02:18:18.370 回答
0

在第二种情况下,您忘记转义括号。尝试

for word in string.gmatch(str, 'TRANS%s*%(%s*(%b"")%s*%)') do print(word) end
于 2011-07-05T00:35:26.160 回答