string.gsub 和 string.gmatch
替换字符串中的模式匹配内容,并遍历所有匹配项。
string.gsub 和 string.gmatch 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
string.gsub 基础
string.gsub(s, pattern, repl, n) 会将 s 中与 pattern 匹配的内容替换为 repl,最多替换 n 次(默认全部替换)。它会返回替换后的字符串和实际替换次数。替换内容可以是字符串、表或函数。
local s = "hello world hello"
local result, count = string.gsub(s, "hello", "hi")
print(result) -- hi world hi
print(count) -- 2
-- Limit replacements
local r2 = string.gsub(s, "hello", "hi", 1)
print(r2) -- hi world hello替换中的捕获引用
在替换字符串中,%1、%2 等表示模式中的捕获内容。%0 表示整个匹配项。您可以使用这些引用重新排列或包裹匹配到的文本。
-- Swap first and last name
local name = "Smith, John"
local swapped = string.gsub(name, "(%a+), (%a+)", "%2 %1")
print(swapped) -- John Smith
-- Wrap numbers in brackets
local text = "items: 3 and 7 total 10"
local tagged = string.gsub(text, "%d+", "[%0]")
print(tagged) -- items: [3] and [7] total [10]使用函数进行替换
当替换内容是函数时,gsub 会针对每个匹配项(或捕获内容)调用该函数,并使用返回值作为替换内容。返回 nil 或 false 可保留原始匹配项。这样可以实现动态计算的替换。
local env = {NAME="Lua", VERSION="5.4"}
local template = "Welcome to $NAME version $VERSION!"
local result = string.gsub(template, "%$(%w+)", env)
print(result) -- Welcome to Lua version 5.4!
-- Double each number
local s = "a1 b2 c3"
local r = string.gsub(s, "%d+", function(n)
return tostring(tonumber(n) * 2)
end)
print(r) -- a2 b4 c6使用表进行替换
当替换内容是表时,gsub 会使用每个匹配项(或第一个捕获内容)作为键在表中查找,并使用查找结果进行替换。如果查找结果为 nil 或 false,则保留原始匹配项。这非常适合用于替换字典。
local abbreviations = {
str = "string",
num = "number",
tbl = "table",
fn = "function",
}
local text = "A str can hold a num or a tbl"
local expanded = string.gsub(text, "%a+", abbreviations)
print(expanded)
-- A string can hold a number or a tablestring.gmatch 基础
string.gmatch(s, pattern) 会返回一个迭代器,用于遍历 s 中与 pattern 匹配的所有内容。每次调用该迭代器都会返回下一个匹配项(如果模式包含捕获内容,则返回捕获内容)。这是 Lua 中遍历匹配项的惯用方式。
local s = "one=1 two=2 three=3"
-- Iterate all words
for word in string.gmatch(s, "%a+") do
io.write(word .. " ")
end
print() -- one two three
-- Iterate key=value pairs
for k, v in string.gmatch(s, "(%a+)=(%d+)") do
print(k, v)
end使用 gmatch 进行词法分析
使用 string.gmatch 对输入进行词法分析:按空白拆分、解析 CSV 行,或提取结构化数据。模式定义要捕获的内容,其余部分都被视为分隔符。
-- Split by whitespace
local function tokenize(s)
local tokens = {}
for token in string.gmatch(s, "%S+") do
tokens[#tokens+1] = token
end
return tokens
end
local toks = tokenize(" hello world lua ")
for i, t in ipairs(toks) do
print(i, t)
end
-- 1 hello 2 world 3 lua解析 URL 参数
通过遍历键值对来解析查询字符串。模式 ([^&=]+)=([^&]+) 会捕获每个键和值;它们由 = 分隔,并位于 & 分隔符之间。
local url_params = "name=Alice&age=30&city=Istanbul"
local params = {}
for key, value in string.gmatch(url_params, "([^&=]+)=([^&]*)") do
params[key] = value
end
print(params.name) -- Alice
print(params.age) -- 30
print(params.city) -- Istanbul去除 HTML 标签
一种常见的文本处理任务是从字符串中删除 HTML 标签。使用 string.gsub 和匹配开始标签及结束标签的模式,将它们替换为空字符串。
local html = "<h1>Hello</h1> <p>World <b>bold</b></p>"
local plain = string.gsub(html, "<[^>]+>", "")
print(plain) -- Hello World bold
-- Replace <br> with newline
local html2 = "line1<br>line2<br/>line3"
local fixed = string.gsub(html2, "<br/?>", "\n")
print(fixed)转义特殊字符
Lua 模式中的特殊字符包括:. + * ? [ ] ^ $ % ( )。要按字面意义匹配这些字符,请使用 % 进行转义。使用包含这些字符的普通字符串时,将 true 作为第四个参数传给 string.find,即可禁用模式匹配。
-- Escape a string for use in a pattern
local function escapePattern(s)
return (string.gsub(s, "[%(%)%.%%%+%-%*%?%[%^%$]", "%%%1"))
end
local query = "1+1=2"
local pattern = escapePattern(query)
print(string.find("result: 1+1=2", pattern, 1)) -- 9 13统计出现次数
使用 string.gsub 的第二个返回值(替换次数)可以统计字符串中模式出现的次数,即使不实际进行替换。
local text = "banana"
local _, count = string.gsub(text, "a", "")
print("'a' appears " .. count .. " times") -- 3
-- Count words
local sentence = "the quick brown fox"
local _, wordCount = string.gsub(sentence, "%S+", "")
print("Words:", wordCount) -- 4快速检查
string.gsub("hello", "l", "L") 会返回什么?
回顾:gsub 和 gmatch
总结:
gsub(s, pat, repl, n)— 进行替换;repl 可以是字符串、表或函数- 替换字符串中的
%1……%n引用捕获内容 gmatch(s, pat)— 遍历所有匹配项- 使用
%转义特殊模式字符:%.、%+等 - 统计出现次数:使用 gsub 的第二个返回值
常见问题解答
「string.gsub 和 string.gmatch」课时是免费的吗?
是的 — 「string.gsub 和 string.gmatch」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「string.gsub 和 string.gmatch」这节课中我会学到什么?
替换字符串中的模式匹配内容,并遍历所有匹配项。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「string.gsub 和 string.gmatch」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 字符串基础:连接和长度
- 查找和提取子字符串
- 使用 string.format 生成输出
- string.gsub 和 string.gmatch