Lua 5.0:string.split 使用教程
在很多脚本里我们经常需要把 "a,b,c" 这种字符串按分隔符切成数组。Lua 标准库没有自带 string.split,所以我们在 string 库里补充了一个:
local arr = string.split(full, sep)
它的行为对齐常见的“字符串切分”用法,(按 len(sep) 步进,返回 table)。
1. 函数签名
string.split(full, sep) --> table
full:要切分的完整字符串
sep:分隔符(纯文本)
- 返回值:一个 从 1 开始索引 的 table(数组风格)
注意:sep 不能为空字符串 "",否则会报错:string.split: separator is empty
2. 基础示例
示例 1:按逗号分割
local t = string.split("a,b,c", ",")
-- t = {"a", "b", "c"}
for i, v in ipairs(t) do
print(i, v)
end
输出:
1 a
2 b
3 c
示例 2:多字符分隔符
local t = string.split("a--b--c", "--")
-- t = {"a", "b", "c"}
这点很重要:分隔符不只是 1 个字符,可以是任意长度。
3. 与你原来的 Split() 写法兼容
如果你在 luaopen_string 里额外做了别名:
Split = string.split
那么你原来的脚本可以不改:
local t = Split("x|y|z", "|")
4. 关键行为说明(务必看)
4.1 分隔符是“纯文本”,不是 Lua 模式(pattern)
也就是说:
- 分隔符
"." 就是点号本身
- 分隔符
"*" 就是星号本身
不会像 string.find 那样把它当作模式符号。
示例:
local t = string.split("a.b.c", ".")
-- {"a","b","c"}
4.2 会保留“空字段”(非常适合协议解析)
当字符串里出现连续分隔符、或者以分隔符开头/结尾时,会出现空字符串字段,这和你参考 Lua 代码行为一致。
连续分隔符
local t = string.split("a,,b", ",")
-- {"a", "", "b"}
以分隔符开头
local t = string.split(",a,b", ",")
-- {"", "a", "b"}
以分隔符结尾
local t = string.split("a,b,", ",")
-- {"a", "b", ""}
4.3 分隔符不能为空(会报错)
local t = string.split("abc", "")
-- 报错:string.split: separator is empty
原因:空分隔符会导致“无限切分”,没有明确的语义,直接禁止更安全。
5. 常见用法:解析 key=value;key=value 的配置串
比如:
local s = "id=1001;name=Jack;vip=1"
local parts = string.split(s, ";")
local cfg = {}
for _, kv in ipairs(parts) do
local pair = string.split(kv, "=")
local k = pair[1]
local v = pair[2]
cfg[k] = v
end
-- cfg.id -> "1001"
-- cfg.name -> "Jack"
-- cfg.vip -> "1"
6. 常见坑与建议
6.1 结果是字符串,不会自动 tonumber
如果你要数值,请自己 tonumber:
local t = string.split("10,20,30", ",")
local a = tonumber(t[1])
6.2 可能出现 "" 空字段
解析协议时建议明确处理:
for i, v in ipairs(t) do
if v ~= "" then
-- 有效字段
end
end
7. 小结
string.split(full, sep):把字符串按 纯文本分隔符切成 table
- 支持多字符分隔符
- 保留空字段(连续分隔、首尾分隔符都会产生
"")
- 分隔符不能为空