将字符串拆分为Lua中的二维表

时间:2016-01-10 06:03:17

标签: string split lua lua-patterns

我们说我有这个字符串:

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 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