如何在Lua中将字符串拆分为二维表及单个字符数组?
字符串拆分为Lua数组与二维表的实现方式
一、拆分单个字符到一维数组
1. 处理字符串输入
直接遍历字符串的每个字符存入数组,需注意区分ASCII单字节字符和UTF-8多字节字符:
local str = "Hello 世界!" local char_array = {} -- 支持UTF-8多字节字符的方式(推荐,兼容中文、日文等) for char in string.gmatch(str, "([%z\1-\127\194-\244][\128-\191]*)") do table.insert(char_array, char) end -- 仅适用于ASCII单字节字符的方式(多字节字符会拆分成乱码) -- for i = 1, #str do -- table.insert(char_array, str:sub(i, i)) -- end -- 验证结果 for _, c in ipairs(char_array) do print(c) end
2. 处理文本文件输入
先读取文件内容,再按上述逻辑拆分:
local file = io.open("input.txt", "r") if not file then error("无法打开目标文件") end local content = file:read("*a") -- 读取整个文件内容 file:close() local char_array = {} for char in string.gmatch(content, "([%z\1-\127\194-\244][\128-\191]*)") do table.insert(char_array, char) end
二、拆分字符串为二维表
二维表的拆分通常分为两种常见场景,可按需选择:
1. 按换行拆分(保留文本的行结构)
先将字符串按换行符拆分为行,再把每行拆分为字符数组:
local str = "第一行内容\n第二行abc\n第三行xyz" local two_d_array = {} -- 遍历每一行 for line in string.gmatch(str, "[^\n]+") do local line_chars = {} -- 拆分当前行的每个字符 for char in string.gmatch(line, "([%z\1-\127\194-\244][\128-\191]*)") do table.insert(line_chars, char) end table.insert(two_d_array, line_chars) end -- 打印验证 for _, line in ipairs(two_d_array) do print(table.concat(line, ",")) end
2. 按固定长度拆分(每N个字符为一行)
比如设定每行3个字符,将长字符串拆分为二维表:
local str = "abcdefghijklmn" local cols = 3 -- 每行字符数 local two_d_array = {} local current_line = {} local count = 0 for char in string.gmatch(str, "([%z\1-\127\194-\244][\128-\191]*)") do table.insert(current_line, char) count = count + 1 -- 达到设定长度则存入二维表并重置当前行 if count == cols then table.insert(two_d_array, current_line) current_line = {} count = 0 end end -- 处理剩余不足一行的字符 if #current_line > 0 then table.insert(two_d_array, current_line) end -- 打印验证 for _, line in ipairs(two_d_array) do print(table.concat(line, ",")) end
关键注意事项
- 处理包含多字节的UTF-8字符时,必须使用
string.gmatch的正则匹配方式,避免用sub或按字节索引拆分导致乱码。 - 读取大文件时,建议逐行处理而非一次性加载全部内容,减少内存占用:
local file = io.open("large_file.txt", "r") if not file then error("无法打开目标文件") end local two_d_array = {} for line in file:lines() do local line_chars = {} for char in string.gmatch(line, "([%z\1-\127\194-\244][\128-\191]*)") do table.insert(line_chars, char) end table.insert(two_d_array, line_chars) end file:close()
内容的提问来源于stack exchange,提问作者mdhcraft
相关产品推荐
相关产品推荐

