【问题标题】:Lua split strings into Keys and Values of a tableLua 将字符串拆分为表的键和值
【发布时间】:2014-10-28 15:49:35
【问题描述】:

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

如果:

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

等等……

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

【问题讨论】:

  • 不要修改它。拆分它们,然后从 1 循环到 #splitkeytable,并使用来自 splitkeytable 的键和来自 splitvaluetable 的值创建一个新表。

标签: string lua split lua-table


【解决方案1】:

你可以这样直接使用:

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 谢谢!你们太棒了。编辑:会投票,但没有代表。
    • @CalebPurvis 现在你有了。
    • 太棒了!谢谢。 @雨浩
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2015-01-16
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多