You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 07:15:41