【问题标题】:Splitting string into 2 dimensional table in Lua在Lua中将字符串拆分为二维表
【发布时间】:2016-04-14 15:27:22
【问题描述】:

假设我有这个字符串:

map_data = "     *-*  ;    /|x|\ ;   *-*-*-*;  /|x|x|x|;-*-*-*-*-*;  \|x|x|x|;   *-*-*-*;    \|x|/ ;     *-*  ;"

我想将字符串拆分为分号处的有序表。完成此操作后,我想获取表格的每个元素并将每个字符拆分为一个有序的表格(嵌套在第一个表格中)。这个想法是为 ascii 映射创建一个二维表。

我已经尝试过了(但它不起作用,我还怀疑有更简单的方法):

map_data = "     *-*  ;    /|x|\ ;   *-*-*-*;  /|x|x|x|;-*-*-*-*-*;  \|x|x|x|;   *-*-*-*;    \|x|/ ;     *-*  ;"

map = {}

p = 1
pp = 1
for i in string.gmatch(map_data, "(.*);") do
    map[p] = {}
    for ii in string.gmatch(i, ".") do
        map[p][pp] = ii
        pp = pp + 1
    end
    p = p + 1
end

【问题讨论】:

  • 不要这样修改原始代码,这会使当前答案无效。

标签: string split lua lua-patterns


【解决方案1】:

首先,字符串map_data 无效,因为\ 需要转义。或者你可以使用长字符串语法[[ ... ]]:

map_data = [[     *-*  ;    /|x|\ ;   *-*-*-*;  /|x|x|x|;-*-*-*-*-*;  \|x|x|x|;   *-*-*-*;    \|x|/ ;     *-*  ;]]

模式(.*);的问题是,修饰符*是贪婪的。相反,请使用 - 惰性修饰符:

for i in string.gmatch(map_data, "(.-);") do

【讨论】:

  • 所以我进行了更改,出于某种原因,它只捕获了第一行:“ - ”。还有什么我做错了吗?
  • @EliBell - pp = 1 应该移到外循环内。
【解决方案2】:

自从我接触 Lua 以来已经有好几年了,但假设你解决了转义字符问题,你就不能做一些类似...

map = {{}} -- map initially contains one empty line 
for i = 1, #map_data do
    local c = map_data:sub(i,i)
    if c == ';' then
        map[#map+1] = {} -- add another line to the end of map
    else
        map[#map][ #map[#map] + 1] = c -- add c to last line in map
    end
end

【讨论】:

  • 还有一个快速的问题。假设我想将字符存储在表中,例如:map[y][x].value,而不是直接存储到 map[y][x]。我需要如何更改代码以免出现零值错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2012-01-25
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多