将字符串分割成Lua的2维表

假设我有这个字符串:

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
点赞
用户1009479
用户1009479

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

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

正则表达式 (.*); 的问题在于,修饰符 * 是贪婪的。相反,可以使用 - 修饰符,它是懒惰的:

for i in string.gmatch(map_data, "(.-);") do
2016-01-10 06:15:51
用户1177147
用户1177147

数年未碰 Lua 了,但假设你解决了转义字符的问题,就可以做类似以下的事情:

map = {{}} -- map 最初包含一个空行
for i = 1, #map_data do
    local c = map_data:sub(i,i)
    if c == ';' then
        map[#map+1] = {} -- 在 map 末尾添加另一行
    else
        map[#map][ #map[#map] + 1] = c -- 将 c 添加到 map 中最后一行
    end
end
2016-01-10 06:23:13