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
我和其他人一样喜欢 Lua 模式,但这不是一个适合使用正则表达式解决的问题。为了正确处理双引号和反斜杠转义,你需要一个真正的解析器,LPEG可以完美地满足你的需求。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
在第二种情况下,您忘记了转义括号。尝试使用下面的代码:
for word in string.gmatch(str, 'TRANS%s*%(%s*(%b"")%s*%)') do print(word) end