Lua多字符串替换与string.gsub
2016-4-28 17:49:40
收藏:0
阅读:72
评论:2
大家好,我正在尝试将存储在.obj文件中的顶点转换为可以在lua中实际使用的表格。
这就是.obj文件的样子:
# Blender v2.77 (sub 0) OBJ File: ''
# www.blender.org
mtllib pyramid.mtl
o Cube
v 1.000000 0.000000 -1.000000
v 1.000000 0.000000 1.000000
v -1.000000 0.000000 1.000000
v -1.000000 0.000000 -1.000000
v -0.000000 2.000000 0.000000
vn 0.0000 -1.0000 0.0000
vn 0.8944 0.4472 0.0000
vn -0.0000 0.4472 0.8944
vn -0.8944 0.4472 -0.0000
vn 0.0000 0.4472 -0.8944
usemtl Material
s off
f 1//1 2//1 3//1 4//1
f 1//2 5//2 2//2
f 2//3 5//3 3//3
f 3//4 5//4 4//4
f 5//5 1//5 4//5
我只需要前面以v开头的5行看起来像这样:
Node1= {x=1.000000, y=0.000000, z=-1.000000}
Node2= {x=1.000000, y=0.000000, z=1.000000}
Node3= {x=-1.000000, y=0.000000, z=1.000000}
Node4= {x=-1.000000, y=0.000000, z=-1.000000}
Node5= {x=-0.000000, y=2.000000, z=0.000000}
使用我编写的代码,我设法将输出看起来像这样:
Node1= {x=1.000000 0.000000 -1.000000}
Node2= {x=1.000000 0.000000 1.000000}
Node3= {x=-1.000000 0.000000 1.000000}
Node4= {x=-1.000000 0.000000 -1.000000}
Node5= {x=-0.000000 2.000000 0.000000}
这是正在工作的代码:
inputFile = io.open("file.txt", "r")
io.input(inputFile)
字符串= io.read("*all")
io.close(inputFile)
outputFile = io.open("object.lua", "a")
io.output(otputFile)
i = 1
for word in
string.gmatch(字符串, " .?%d.%d%d%d%d%d%d .?%d.%d%d%d%d%d%d .?%d.%d%d%d%d%d%d") do
print(word)
-- outputFile:write("Node"..i.. "= {" ..word.. "}\n")
outputFile:write("Node"..i.. "= {" ..string.gsub(word, "(%s)", "x=", 1).. "}\n")
i = i + 1
end
首先它打开.obj文件并将所有内容存储在"字符串"中。 然后它创建"object.lua"。 对于与此模式匹配的每个字符串:
1.000000 0.000000 -1.000000
在字符串中,字符串gmatch将找到它并将其写入输出文件。 但是,首先必须重新格式化字符串。 正如你所看到的,我设法将第一个空格(%s)替换为"x ="。 此外,第二个空格需要替换为", y =",第三个需要替换为",z ="。 但是我看不到如何使用string.gsub以它可以执行多个不同的替换。
这是正确的方法,我只是做错了什么吗? 还是有另一种方法来完成此任务?
点赞
用户3735873
将下面翻译成中文并且保留原本的 markdown 格式,
PATTERN = '^v (%S+) (%S+) (%S+)$'
fo = io.open('object.lua','w')
i = 1
for line in io.lines('file.txt') do
if line:match(PATTERN) then
line = line:gsub(PATTERN,'Node'..i..'= {x=%1, y=%2, z=%3}')
print(line)
fo:write(line,'\n')
i = i + 1
end
end
fo:close()
这是另一种实现方式,但最终结果相同。
首先定义一个模式 PATTERN = '^v (%S+) (%S+) (%S+)$' 用于匹配文本行。
然后打开文件 object.lua。将计数器 i 初始化为1。遍历文件 file.txt 的每一行,如果匹配到模式,则将行中的数据替换为 Nodei={x=%1, y=%2, z=%3} 的形式,并将其写入 object.lua 文件中。之后将计数器 i 自增1。
最后关闭文件 object.lua。
2016-04-28 21:48:17
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
主要问题在于
gsub调用。你应该匹配数字本身([^%s]),而不是开头的空格。这样做就可以了:string.gsub(word, "([^%s]) ([^%s]) ([^%s])", "x=%1 y=%2 z=%3", 1)另外,
gmatch可以简化为这样:string.gmatch(s, "v [0-9.-]* [0-9.-]* [0-9.-]*")实时示例