CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
Lua速成班系统函数string库996引擎

Lua速成班 第十二课 系统函数第二节 string库

2026-10-30 23:26 作者:浮生梦 Lua速成班系统函数string库996引擎
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十二课 系统函数第二节 string库」,主讲:浮生梦。 课程体系:996 引擎传奇开发教学 · 威海旷世互娱教学基地

Lua字符串函数精讲课件


第一节:字符串内部化

Lua中所有字符串都是内部化的。相同的字符串在内存中只存一份,多个变量指向同一地址。

lua
local a = "你好"
local b = "你好"
local c = "你".."好"
print(a == b)  -- true
print(a == c)  -- true

三个变量内容相同,比较结果都是true。字符串存在堆内存,变量名在栈上。

练习题:
验证两个不同方式创建的相同字符串是否相等,打印它们比较的布尔值。

lua
local str1 = "hello"
local str2 = "hel".."lo"
print(str1 == str2)

第二节:find函数——查找位置

find函数返回匹配内容的起始位置和结束位置。找不到返回nil。

lua
local str = "hello world"
local startPos, endPos = string.find(str, "hello")
print(startPos, endPos)  -- 1  5

local s, e = string.find(str, "abc")
print(s, e)  -- nil  nil

第三个参数设置起始查找位置,第四个参数控制是否使用匹配模式。

lua
local str = "abcabcabc"
-- 从第2个位置开始找
local pos, finish = string.find(str, "abc", 2)
print(pos, finish)  -- 4  6

使用匹配模式查找数字:

lua
local str = "hello123world"
local s, e = string.find(str, "%d+")
print(s, e)  -- 6  8

关闭匹配模式,点号当作普通字符:

lua
local str = "hello.world"
-- 第四个参数为true时,关闭模式匹配
local s1, e1 = string.find(str, ".", 1, true)   -- 查找点号本身
local s2, e2 = string.find(str, ".", 1, false)  -- 点号匹配任意字符
print(s1, e1)  -- 6  6
print(s2, e2)  -- 1  1

练习题:
从字符串"我的电话是13800138000"中提取电话号码的起止位置。

lua
local str = "我的电话是13800138000"
local startPos, endPos = string.find(str, "%d+")
print(startPos, endPos)

第三节:sub函数——提取子串

sub函数根据起止位置提取字符串片段。支持负数索引,-1表示最后一个字符。

lua
local str = "hello world"
-- 提取前5个字符
local sub1 = string.sub(str, 1, 5)
print(sub1)  -- hello

-- 提取后5个字符
local sub2 = string.sub(str, -5)
print(sub2)  -- world

-- 提取倒数第5个到倒数第1个
local sub3 = string.sub(str, -5, -1)
print(sub3)  -- world

与find配合实现精准提取:

lua
local str = "今日日期:2026-3-12"
local s, e = string.find(str, "%d+-%d+-%d+")
local date = string.sub(str, s, e)
print(date)  -- 2026-3-12

练习题:
提取字符串"filename.txt"中的文件名部分(不含扩展名)。

lua
local str = "filename.txt"
local dotPos = string.find(str, "%.", -5)  -- 从后往前找点号
local name = string.sub(str, 1, dotPos - 1)
print(name)

第四节:format函数——格式化占位

format函数使用占位符拼接字符串,%s表示字符串,%d表示数字。

lua
local name = "张三"
local age = 18
local job = "学生"
local address = "中国"

local info = string.format("姓名:%s,年龄:%d,职业:%s,地址:%s", name, age, job, address)
print(info)

占位符数量必须与传入参数数量一致,否则会报错。

lua
local template = "名字:%s,年龄:%d"
-- 正确:两个占位符对应两个参数
print(string.format(template, "李四", 20))

-- 错误:参数过多或过少都会报错
-- print(string.format(template, "李四"))  -- 报错,缺少参数
-- print(string.format(template, "李四", 20, "多余"))  -- 报错,参数过多

练习题:
使用format生成装备信息,包含装备名、等级、攻击力三个字段。

lua
local equipName = "屠龙刀"
local level = 50
local atk = 999
local info = string.format("装备:%s,等级:%d,攻击力:%d", equipName, level, atk)
print(info)

第五节:gsub函数——全局替换

gsub函数替换所有匹配内容。第三个参数限制替换次数。

lua
local str = "我是学生,我是学生,我是学生"
-- 全局替换
local newStr1 = string.gsub(str, "我", "你")
print(newStr1)  -- 你是学生,你是学生,你是学生

-- 只替换前2个
local newStr2 = string.gsub(str, "我", "他", 2)
print(newStr2)  -- 他是学生,他是学生,我是学生

使用匹配模式替换所有数字:

lua
local str = "我有100元,你有200元"
local result = string.gsub(str, "%d+", "***")
print(result)  -- 我有***元,你有***元

练习题:
将字符串中的连续数字替换为"数字",只替换第一次出现的数字。

lua
local str = "第1名获得100金币,第2名获得50金币"
local result = string.gsub(str, "%d+", "数字", 1)
print(result)

第六节:len函数与长度计算

len函数获取字符串长度,与#运算符效果相同。注意中文编码占用字节数。

lua
local str1 = "hello"
print(string.len(str1))  -- 5
print(#str1)             -- 5

-- UTF-8编码下,中文占3个字节
local str2 = "你好"
print(string.len(str2))  -- 6
print(#str2)             -- 6

练习题:
分别计算纯英文字符串和纯中文字符串的长度,观察差异。

lua
local en = "Lua"
local cn = "编程"
print("英文长度:", string.len(en))
print("中文长度:", string.len(cn))

第七节:match函数——匹配提取

match直接返回匹配内容。使用括号可分别捕获多个值。

lua
local str = "今日日期:2026-3-12"
-- 基础匹配
local date = string.match(str, "%d+-%d+-%d+")
print(date)  -- 2026-3-12

-- 括号捕获分组
local year, month, day = string.match(str, "(%d+)-(%d+)-(%d+)")
print(year, month, day)  -- 2026  3  12

捕获数量与变量数量不匹配时,多余的匹配被忽略,缺少的变量为nil。

lua
local str = "2026-3-12"
local y, m, d, extra = string.match(str, "(%d+)-(%d+)-(%d+)")
print(y, m, d, extra)  -- 2026  3  12  nil

练习题:
从"玩家:admin,等级:99,金币:5000"中提取玩家名、等级、金币三个值。

lua
local str = "玩家:admin,等级:99,金币:5000"
local name, level, gold = string.match(str, "玩家:(%a+),等级:(%d+),金币:(%d+)")
print(name, level, gold)

第八节:gmatch函数——迭代匹配

gmatch返回迭代器,可遍历所有匹配项。

lua
local str = "hello world from lua"
-- 遍历所有单词
for word in string.gmatch(str, "%a+") do
    print(word)
end
-- 输出: hello  world  from  lua

提取所有数字并存入数组:

lua
local str = "年龄18,存款1000000"
local t = {}
local n = 0
for num in string.gmatch(str, "%d+") do
    n = n + 1
    t[n] = num
end
print("年龄:", t[1], "存款:", t[2])

练习题:
从字符串中提取所有数字,计算它们的总和。

lua
local str = "数学90分,语文85分,英语88分"
local sum = 0
for score in string.gmatch(str, "%d+") do
    sum = sum + tonumber(score)
end
print("总分:", sum)

第九节:语法糖——冒号调用

string库的函数可以使用冒号语法,将字符串放前面,省略第一个参数。

lua
local str = "hello world"

-- 标准写法
local s1 = string.find(str, "hello")

-- 语法糖写法,效果相同
local s2 = str:find("hello")

-- sub函数同样适用
local sub1 = string.sub(str, 1, 5)
local sub2 = str:sub(1, 5)

-- match函数
local m1 = string.match(str, "%a+")
local m2 = str:match("%a+")

练习题:
使用冒号语法重写以下代码,分别用find、sub、match、gsub各写一次。

lua
local str = "user123@qq.com"
-- 标准写法
local pos = string.find(str, "@")
local name = string.sub(str, 1, pos - 1)
local domain = string.match(str, "@(%a+)")
local hidden = string.gsub(str, "%d+", "*")

-- 语法糖写法
local pos2 = str:find("@")
local name2 = str:sub(1, pos2 - 1)
local domain2 = str:match("@(%a+)")
local hidden2 = str:gsub("%d+", "*")

课后作业

作业1:邮箱格式验证
给定字符串"323786@qq.com",使用find验证格式是否正确(数字+@+字母),返回@的位置。如果格式错误返回提示。

作业2:敏感词过滤
给定字符串"这个版本真垃圾,垃圾GM",使用gsub将所有"垃圾"替换为"良心",并统计替换了几次。

作业3:属性面板生成
定义变量:attackdamage 攻击怪物 如果怪物包含祖玛 自己等级提升1级

作业4:数据清洗
给字符串"攻击100 攻击200 攻击300 攻击400",使用gmatch提取所有价格数字,计算平均价格并输出"平均伤害:XXX元"。



本文为《Lua速成班》系列课程实录整理。想系统学习 996 引擎 Lua 开发,请查看课程中心与更多技术文章。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

Lua速成班系统函数

Lua速成班 第十一课 系统函数 第一节

本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十一课 系统函数 第一节」,主讲:浮生梦。 课程体系:996…

2026-10-30 23:26 浮生梦
Lua速成班系统函数

Lua速成班 第十二课 系统函数第二节 string库

本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十二课 系统函数第二节 string库」,主讲:浮生梦。 课…

2026-10-30 23:26 浮生梦
Lua速成班后端面向对象

Lua速成班 第九课 后端面向对象和事件推送

本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第九课 后端面向对象和事件推送」,主讲:浮生梦。 课程体系:9…

2026-10-30 23:26 浮生梦
Lua速成班后端面向对象

Lua速成班 第十课 后端面向对象 class构造

本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十课 后端面向对象 class构造」,主讲:浮生梦。 课程体…

2026-10-30 23:26 浮生梦
幂尔框架接口调用

print 大法:让代码自己交代问题

代码不说话, 让它自己说 。 print 是 Lua 战士的第一件武器——用好它,八成的 bug 不用看第二眼。 <styl…

2026-10-26 19:04 996 技术组
幂尔框架接口调用

事件推送:别问,等框架喊你

新手爱问「我怎么知道玩家上线了」—— 你不用知道,框架会喊你 。轮询是你去问,事件是它来叫:理解事件推送,才算入了框架的门。…

2026-10-26 19:04 996 技术组