string.gsub 就是全局替换,把字符串里所有匹配到的部分换成指定内容。写法是 string.gsub(s, 模式, 替换内容, 次数),返回两个值:替换后的新字符串和替换次数;原字符串不会变,结果要记得接收。
模式用的是 Lua 自己的一套规则:%d 数字、%a 字母、%s 空白、%w 字母数字。替换内容里 %0 代表整个匹配,%1 代表第一个捕获。
local s = "a1b2c3"
local new, n = string.gsub(s, "%d", "#") -- 把数字都换成 #
print(new, n) -- a#b#c# 3
-- 第四个参数限制替换次数,只换前 2 个
print(string.gsub(s, "%d", "#", 2)) -- a#b#c3 2
想按捕获内容调换位置,就用括号分组;模式里匹配真正的点必须写成 %.,不然 . 是通配符。
-- 把 key=value 换序成 value:key
print(string.gsub("a=1,b=2", "(%w+)=(%w+)", "%2:%1")) -- 1:a,2:b
-- 匹配真正的点号
print(string.gsub("1.2.3", "%.", "-")) -- 1-2-3
替换内容还能传函数或表:传函数时,函数收到匹配到的内容,返回值就是替换值,返回 nil 保持原样;传表时,用匹配到的内容去查表取值。做批量关键词替换用表最省事。