CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

Lua+string.gmatch:迭代匹配的遍历本质

2026-09-29 15:16 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【语法算法】

gmatch 的迭代本质就这一行:

lua
for match in string.gmatch(str, pattern) do print(match) end

gmatch 返回一个迭代函数——每次调用返回下一个匹配——遍历完返回 nil 终止——gmatch 的全部机制就这一行。今天拆开。

一、模式、迭代、捕获三段

gmatch 的三段。模式:gmatch 的第二个参数是 Lua 模式匹配字符串——%a 匹配字母,%d 匹配数字,%w 匹配字母数字——模式决定了"什么算一次匹配"。迭代:gmatch 返回一个迭代函数——for 循环每次调用迭代函数获取下一个匹配——匹配是懒惰的,每次只找一个——不匹配了就返回 nil 终止循环。捕获:模式里如果有捕获组 (),迭代函数返回捕获组的内容而不是整个匹配——没有捕获组就返回整个匹配——捕获组让 gmatch 可以"提取模式中的特定部分"。三段连起来:gmatch 玩的是"用模式遍历字符串中的所有匹配"——不是找第一个匹配就停,是遍历所有匹配。

mermaid
graph TD
    A["gmatch(str, pattern)"] --> B["返回迭代函数"]
    B --> C["for循环调用迭代函数"]
    C --> D["找到匹配 → 返回"]
    C --> E["没有匹配 → 返回nil"]
    D --> F["继续下一次调用"]

二、gmatch 的正确写法

lua
local str = "apple,banana,cherry"
for fruit in string.gmatch(str, "[^,]+") do
    print(fruit)
end
-- apple
-- banana
-- cherry

local config = "host=127.0.0.1;port=3306;name=db"
for k, v in string.gmatch(config, "(%w+)=(%S+)") do
    print(k, v)
end
-- host  127.0.0.1
-- port  3306
-- name  db

双捕获组 (%w+)=(%S+) 让 for 循环的变量从单值变多值——每个匹配返回两个捕获组的内容——键值对的解析用 gmatch 一行搞定。

三、模式的边界与 gmatch 的纪律

[^,]+ 的 ^ 在方括号内是"非"的意思——匹配逗号以外的所有字符——+ 表示一个或多个——这个模式把逗号当分隔符把字符串拆成多段。gmatch 有一个盲区:空匹配——如果模式可以匹配空串(比如 a*),gmatch 会无限循环返回空匹配——避免空匹配的方法是模式里必须有至少一个"必须匹配的字符"——a* 改成 a+ 就不会返回空匹配。最后一条纪律:gmatch 的迭代函数是有状态的——每次调用内部指针往前移——迭代函数不能被多个 for 循环共享——每个 for 循环需要自己的 gmatch 调用。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

绝境回纹:血越少纹越亮,一口气回到满

【游戏功能】 再抛一个老问题:奶量是固定好还是浮动好?固定回五十的术式,满血喝是五十、残血喝也是五十,账目清楚,可总差点意思…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

蚀蓝纹咒:抽干它的法力,咒念憋在喉咙里

【游戏功能】 前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

双纹换形:红纹饮刀蓝纹披甲,一念换身

【游戏功能】 mode=mode==='red'?'blue':'red' ——先拆这一行。一个变量存着当前纹色,三元运算符…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

免死金纹:纹碎金光,刀下留人一线

【游戏功能】 上一版埋了个查了半宿的隐蔽报错:测试组报"玩家血条归零了人还站着",后台的死亡日志一条没有,复活接口也没被调过…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

夺纹掠势:剥了它的怒,披在我身上

【游戏功能】 先抛一个坑:增益为什么只能自己挂?怒气、护体、神行,攻略里全在教你"什么时候开自己的招",可怪身上明晃晃挂着的…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

反纹镜咒:纹光一闪,它的火原路奉还

【游戏功能】 昨天夜里一场线上事故把"反纹"顶上了台面:一个玩家把反纹挂在自己身上站桩挂机,怪的火球过来他没倒,反倒躺下的是…

2026-10-01 20:32 996 技术组