0Pricing
Lua Academy · 课时

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 table

string.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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 字符串基础:连接和长度
  2. 查找和提取子字符串
  3. 使用 string.format 生成输出
  4. string.gsub 和 string.gmatch
← 返回 Lua Academy