本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十二课 系统函数第二节 string库」,主讲:浮生梦。 课程体系:996 引擎传奇开发教学 · 威海旷世互娱教学基地
Lua中所有字符串都是内部化的。相同的字符串在内存中只存一份,多个变量指向同一地址。
local a = "你好"
local b = "你好"
local c = "你".."好"
print(a == b) -- true
print(a == c) -- true
三个变量内容相同,比较结果都是true。字符串存在堆内存,变量名在栈上。
练习题:
验证两个不同方式创建的相同字符串是否相等,打印它们比较的布尔值。
local str1 = "hello"
local str2 = "hel".."lo"
print(str1 == str2)
find函数返回匹配内容的起始位置和结束位置。找不到返回nil。
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
第三个参数设置起始查找位置,第四个参数控制是否使用匹配模式。
local str = "abcabcabc"
-- 从第2个位置开始找
local pos, finish = string.find(str, "abc", 2)
print(pos, finish) -- 4 6
使用匹配模式查找数字:
local str = "hello123world"
local s, e = string.find(str, "%d+")
print(s, e) -- 6 8
关闭匹配模式,点号当作普通字符:
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"中提取电话号码的起止位置。
local str = "我的电话是13800138000"
local startPos, endPos = string.find(str, "%d+")
print(startPos, endPos)
sub函数根据起止位置提取字符串片段。支持负数索引,-1表示最后一个字符。
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配合实现精准提取:
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"中的文件名部分(不含扩展名)。
local str = "filename.txt"
local dotPos = string.find(str, "%.", -5) -- 从后往前找点号
local name = string.sub(str, 1, dotPos - 1)
print(name)
format函数使用占位符拼接字符串,%s表示字符串,%d表示数字。
local name = "张三"
local age = 18
local job = "学生"
local address = "中国"
local info = string.format("姓名:%s,年龄:%d,职业:%s,地址:%s", name, age, job, address)
print(info)
占位符数量必须与传入参数数量一致,否则会报错。
local template = "名字:%s,年龄:%d"
-- 正确:两个占位符对应两个参数
print(string.format(template, "李四", 20))
-- 错误:参数过多或过少都会报错
-- print(string.format(template, "李四")) -- 报错,缺少参数
-- print(string.format(template, "李四", 20, "多余")) -- 报错,参数过多
练习题:
使用format生成装备信息,包含装备名、等级、攻击力三个字段。
local equipName = "屠龙刀"
local level = 50
local atk = 999
local info = string.format("装备:%s,等级:%d,攻击力:%d", equipName, level, atk)
print(info)
gsub函数替换所有匹配内容。第三个参数限制替换次数。
local str = "我是学生,我是学生,我是学生"
-- 全局替换
local newStr1 = string.gsub(str, "我", "你")
print(newStr1) -- 你是学生,你是学生,你是学生
-- 只替换前2个
local newStr2 = string.gsub(str, "我", "他", 2)
print(newStr2) -- 他是学生,他是学生,我是学生
使用匹配模式替换所有数字:
local str = "我有100元,你有200元"
local result = string.gsub(str, "%d+", "***")
print(result) -- 我有***元,你有***元
练习题:
将字符串中的连续数字替换为"数字",只替换第一次出现的数字。
local str = "第1名获得100金币,第2名获得50金币"
local result = string.gsub(str, "%d+", "数字", 1)
print(result)
len函数获取字符串长度,与#运算符效果相同。注意中文编码占用字节数。
local str1 = "hello"
print(string.len(str1)) -- 5
print(#str1) -- 5
-- UTF-8编码下,中文占3个字节
local str2 = "你好"
print(string.len(str2)) -- 6
print(#str2) -- 6
练习题:
分别计算纯英文字符串和纯中文字符串的长度,观察差异。
local en = "Lua"
local cn = "编程"
print("英文长度:", string.len(en))
print("中文长度:", string.len(cn))
match直接返回匹配内容。使用括号可分别捕获多个值。
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。
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"中提取玩家名、等级、金币三个值。
local str = "玩家:admin,等级:99,金币:5000"
local name, level, gold = string.match(str, "玩家:(%a+),等级:(%d+),金币:(%d+)")
print(name, level, gold)
gmatch返回迭代器,可遍历所有匹配项。
local str = "hello world from lua"
-- 遍历所有单词
for word in string.gmatch(str, "%a+") do
print(word)
end
-- 输出: hello world from 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])
练习题:
从字符串中提取所有数字,计算它们的总和。
local str = "数学90分,语文85分,英语88分"
local sum = 0
for score in string.gmatch(str, "%d+") do
sum = sum + tonumber(score)
end
print("总分:", sum)
string库的函数可以使用冒号语法,将字符串放前面,省略第一个参数。
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各写一次。
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元"。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十一课 系统函数 第一节」,主讲:浮生梦。 课程体系:996…
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十二课 系统函数第二节 string库」,主讲:浮生梦。 课…
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第九课 后端面向对象和事件推送」,主讲:浮生梦。 课程体系:9…
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十课 后端面向对象 class构造」,主讲:浮生梦。 课程体…
代码不说话, 让它自己说 。 print 是 Lua 战士的第一件武器——用好它,八成的 bug 不用看第二眼。 <styl…
新手爱问「我怎么知道玩家上线了」—— 你不用知道,框架会喊你 。轮询是你去问,事件是它来叫:理解事件推送,才算入了框架的门。…