gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:48 26 4
gpt4 key购买 nike

我正在使用 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 个或多个空格,最后以 ) 结束。不幸的是,这在使用时不会返回单个值。但是......我认为即使它像我预期的那样工作......里面可能有一个\",这会导致支架不平衡。

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

最佳答案

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

关于c++ - 用于在代码库中提取硬编码字符串的 Lua 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6576769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com