string - Lua 使用 string.gsub 进行多个字符串替换

标签 string serialization lua vertex

您好,我正在尝试将存储在 .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)
string = io.read("*all")
io.close(inputFile)

outputFile = io.open("object.lua", "a")
io.output(otputFile)


i = 1
for word in
    string.gmatch(string, " .?%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 文件并将所有内容存储在“string”中。 然后它创建“object.lua”。对于与此模式匹配的每个字符串:

1.000000 0.000000 -1.000000

在字符串中,string.gmatch会找到它并将其写入输出文件。但首先它必须重新格式化字符串。正如你所看到的,我成功地将第一个空格(%s)替换为“x=”。此外,第二个空格需要替换为“, y=”,第三个空格需要替换为“, z=”。 但是我不知道如何使用 string.gsub 来进行多种不同的替换。

这是正确的方法吗?我只是做错了什么? 或者还有其他方法来完成这个任务吗?

最佳答案

整体方法的变体,但最终结果相同。

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()

关于string - Lua 使用 string.gsub 进行多个字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36922005/

相关文章:

arrays - Lua 表是如何在内存中处理的?

java - 使用 stringtokenizer 分割字符串

java.io.NotSerializableException : java. util.HashMap$值

c# - 不使用 XmlInclude 进行序列化

java - 应用程序配置保存到文件或对象序列化

lua - 为什么在迭代表时会得到这个 "attempt to call a table value"?

variables - Lua元表变量声明

excel - 将单词中的字母分类为元音和辅音

c - 函数和字符串

python - 查找不等于特定值的第一个元素的索引