找回密码
 register

QQ登录

只需一步,快速开始

搜索
查看: 6|回复: 0

[自写函数] Lua 自写函数 string.split 使用教程

[复制链接]
  • 打卡等级:本地老炮
  • 打卡总天数:380
  • 打卡月天数:28
  • 打卡总奖励:378
  • 最近打卡:2025-12-28 01:37:41
Waylee 发表于 2025-12-28 01:37 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

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
  • 支持多字符分隔符
  • 保留空字段(连续分隔、首尾分隔符都会产生 ""
  • 分隔符不能为空
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 ( 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 ) |网站地图|天天打卡

GMT+8, 2025-12-28 05:48 , Processed in 0.086114 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表