我需要一个工具来解析Lua表格,最好用Ruby或Java。
我需要一个工具来解析 Lua 表达式中的表格。如果其他方法都失败了,我最终只会编写一个小型的 Lua 模块将表格转换为 XML,但目前我对使用 Ruby 库进行转换感兴趣,但如果找不到,我会接受任何语言的工具,只要我可以查看它的源代码。
以下是一个示例片段(是一个 WoW 插件输出):
CT_RaidTracker_RaidLog = {
{
["PlayerInfos"] = {
["Nyim"] = {
["race"] = "Orc",
["guild"] = "Excubitores Noctae",
["sex"] = 2,
["class"] = "HUNTER",
["level"] = 70,
},
["Zyrn"] = {
["race"] = "BloodElf",
["guild"] = "Excubitores Noctae",
["sex"] = 2,
["class"] = "WARLOCK",
["level"] = 70,
},
...
基本想法是,嵌套的关联数组。任何帮助或指针都将被审查,任何想法都将被欣赏。
编辑#1
由于争议,让我澄清我尝试了什么。我补充了一个参与者提供的字符串 / 正则表达式替换链,如下所示:
str.gsub(/--.+$/, "").gsub("=", ":").gsub(/[\[\]]/,"").gsub('" :','":').gsub(/,\s*\n(\s*)}/, "\n\\1}")
我(1)添加了Lua注释的删除,(2)替换了其中一个正则表达式替换器:当对象 /数组中有最后一个元素时,它仍然在其后有一个逗号,因此必须覆盖该逗号并正确删除。
你是否注意到了 _双开花括号_?JSON 不喜欢匿名对象。它看起来像这样:
"xxx" = {
{
["aaa"} = {
["bbb"] = {
"ccc" = 7
"ddd" = "a string"
"eee" = "a date/time pattern"
}
},
["qqq"} = {
"hm" = "something"
}
},
{
["aaa"] = {
-- ...
},
["qqq"] = {
-- ...
}
}
}
基本上在根级别,我们实际上有一个类似对象的列表/数组,两者都有 "aaa" 和 "qqq" 部分,以遵循示例。但是,在 Lua 中,显然是允许的,在 JSON 中却不是。因为开头的花括号被视为 “开始一个对象”,但该对象没有名称。
我尝试使用正则表达式检测该情况并将花括号替换为“\ []”对。虽然得到的正则表达式运行良好,但问题仍然存在:好的,我们定义了一个类似对象的数组,但是数组的声明仍然是匿名的。
一个可能的解决方案是,除了检测和替换那些大括号为\ []之外,还要为对象分配索引,例如:“ \“0 \”= { \”aaa \“={...}}, \”1 \“= { \”aaa \“={... } }“等。这(希望最终)的解决方法可能会使其工作... 再次报告。;)
原文链接 https://stackoverflow.com/questions/2370153
对于这种情况,使用JSON可能会更简单。
从lua表中的翻译几乎是1对1的(将=改为:,并从键中删除[和])。这是您示例的JSON等效项:
{
“PlayerInfos”:{
“Nyim”:{
“race”:“兽人”,
“guild”:“Excubitores Noctae”,
“sex”:2,
“class”:“猎人”,
“level”:70
},
“Zyrn”:{
“race”:“BloodElf”,
“guild”:“Excubitores Noctae”,
“sex”:2,
“class”:“WARLOCK”,
“level”:70
},
...
此外,Rails具有内置的JSON解析(通过JSON :: parse)。
为了从ruby应用程序中读取它,您需要执行类似于以下内容:
要求'json'#在Rails应用程序中已经包含
info = JSON :: parse(File.read(“PlayerInfos.json”))
然后玩家信息将可用于:
player_infos = info [“PlayerInfos”]
还有一个java JSON解析器,但我没有经验。
我可能在说一些显而易见的事情,但是 Lua 肯定可以解析 Lua 表。你可以将 Lua“嵌入”到几乎所有主流的语言中,包括 Java 和 Ruby(请在链接中向下滚动以获取 Java 和 Ruby 绑定)。通过嵌入,我指的是解析源文件、调用 Lua 函数并浏览表,甚至可能从 Lua 中调用您的宿主语言编写的函数。这些绑定库可能比将表导出为 XML/JSON 更需要工作,但至少值得一看。
编辑:70 级?那是上个十年的事了 ;)
你提到你只能使用Java、Ruby或PHP来解析这个。一个选项是使用诸如ANTLR之类的工具来为您生成一个小解析器。
ANTLR语法:
语法测试;
解析
:识别符'='表EOF
;
表
:'{'(入口(','入口)* ',?)?'}'
;
入口
:关键字('='值)?
|字符串
|数
;
键
:'['(字符串 |数)']'
|识别符
;
值
:字符串
|数
|识别符
|表
;
识别符
:('a'..'z' | 'A'..'Z' | '_')('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
;
串
:'“'〜'”'* '“'
;
数
:'0'..'9' +
;
空间
:(' '|\ t | \ r | \ n){skip(); }
;
生成一个解析器,可以接受输入,例如:
表= {
[“k1”] =“V1”,
[“k2”] = {[“x”] = 1,[“y”] = 2},
[“k3”] =“v3”
}
并将其转换为:
alt text http://img59.imageshack.us/img59/7112/treef.png
(点击[此处](http://img59.imageshack.us/img59/7112/treef.png)以获取完整分辨率的图像)
从这个树结构编写XML轻而易举。
但正如我所说,Lua表可以看起来与我发布的语法非常不同:字符串可以看起来像:
'a string'
[===[ also ]==] a string ]===]
键和值可以由表达式组成。但是,如果树始终像您发布的那样,这可能是一个选项。
祝你好运!
略过第一行,然后做一些临时的转换,转换为JSON格式。
s=File.readlines("test.luatable")[1..-1].join
JSON.parse(s.gsub("=", ":").gsub(/[\[\]]/,"").gsub('" :','":').gsub(/,\n(.+)\}/,"\n\\1}"))
=> {"PlayerInfos"=>{"Nyim"=>{"guild"=>"Excubitores Noctae", "class"=>"HUNTER",
"level"=>70, "sex"=>2, "race"=>"Orc"}, "Zyrn"=>{"guild"=>"Excubitores Noctae",
"class"=>"WARLOCK", "level"=>70, "sex"=>2, "race"=>"BloodElf"}}}
未验证的代码。同时,我只是在这里跟随 Sbk 的链接,所以我根本不应该得到任何信用。
require 'rubyluabridge'
def lua_data_to_ruby_hash(data)
luastate = Lua::State.new
luastate.eval "d = #{data}"
return luastate.d.to_hash
end
可以指出 Lua 并不具有正则表达式能力,只能进行模式匹配文本替换。
尝试这段代码
function toxml(t,n)
local s=string.rep(" ",n)
for k,v in pairs(t) do
print(s.."<"..k..">")
if type(v)=="table" then
toxml(v,n+1)
else
print(s.." "..v)
end
print(s.."</"..k..">")
end
end
toxml(CT_RaidTracker_RaidLog,0)
我需要在Java中完成这项任务,因此我编写了一个小的库:
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
可以简单地编写一个 Lua 程序将表格输出为 XML,但这取决于你希望 XML 格式如何。也可以参考 LuaXML,它有 xml.save 方法(但是是用 C 编写的),以及 这个问题。