Lua将字符串拆分为表的键和值

时间:2014-09-04 02:05:28

标签: string lua split lua-table

所以我想分割两个字符串,并且能够返回一个表,其中一个字符串等于Keys,另一个字符串表示值。

所以如果:

String1 = "Key1,Key2,Key3,Key4,Key Ect..."
String2 = "Value1,Value2,Value3,Value4,Value Ect..."

输出将是一个表格如下:

Key1 - Value1
Key2 - Value2
Key3 - Value3
Key4 - Value4
Key Ect... - Value Ect...

我一直在看看我在Lua wiki上找到的这个分裂函数

split(String2, ",")

function split(String, pat)
   local t = {}  -- NOTE: use {n = 0} in Lua-5.0
   local fpat = "(.-)" .. pat
   local last_end = 1
   local s, e, cap = str:find(fpat, 1)
   while s do
      if s ~= 1 or cap ~= "" then
     table.insert(t,cap)
      end
      last_end = e+1
      s, e, cap = str:find(fpat, last_end)
   end
   if last_end <= #str then
      cap = str:sub(last_end)
      table.insert(t, cap)
   end
   return t
end

但当然这只会回归:

1 - Value1
2 - Value2

依旧......

我将开始尝试修改此代码,但我不知道我能走多远。

2 个答案:

答案 0 :(得分:2)

您可以直接使用它:

local t1 = split(String1, ",")
local t2 = split(String2, ",")

local result = {}

for k, v in ipairs(t1) do
    result[v] = t2[k]
end

或者,创建自己的迭代器:

local function my_iter(t1, t2)
    local i = 0
    return function() i = i + 1; return t1[i], t2[i] end
end

local result = {}

for v1, v2 in my_iter(t1, t2) do
    result[v1] = v2
end

答案 1 :(得分:2)

下面的代码避免了创建两个临时表:

   function join(s1,s2)
        local b1,e1,k=1
        local b2,e2,v=1
        local t={}
        while true do
            b1,e1,k=s1:find("([^,]+)",b1)
            if b1==nil then break end
            b1=e1+1
            b2,e2,v=s2:find("([^,]+)",b2)
            if b2==nil then break end
            b2=e2+1
            t[k]=v
        end
        return t
    end

    String1 = "Key1,Key2,Key3,Key4"
    String2 = "Value1,Value2,Value3,Value4"

    for k,v in pairs(join(String1,String2)) do
        print(k,v)
    end