Lua 字符串操作:string.sub() 与 string.gsub()
Lua 处理文本任务时,字符串操作是最高频的需求之一。由于 Lua 中的字符串是不可变的,所有操作都会返回一个新的字符串副本,而不会修改原字符串。掌握 string.sub()(截取)和 string.gsub()(替换)是高效处理文本的基础。
一、截取字符串:string.sub()
string.sub() 用于从字符串中提取一部分内容。它根据指定的起始和结束位置返回子串。
1. 基本语法
函数接收三个参数:原字符串、起始索引、结束索引。
string.sub(s, i, j)
s:原字符串。i:起始位置(包含)。j:结束位置(包含),若省略则默认截取到字符串末尾。
2. 索引规则
Lua 的字符串索引从 1 开始,而不是 0。同时,它支持负数索引,表示从字符串末尾开始计数。
1:第一个字符。-1:最后一个字符。-2:倒数第二个字符。
3. 实操步骤
截取指定范围
输入以下代码并执行:
local str = "Hello Lua"
local result = string.sub(str, 1, 5)
print(result)
代码会提取从第 1 个字符到第 5 个字符,输出 Hello。
截取到末尾
省略第三个参数 j,代码会自动截取从起始位置到字符串末尾。
local str = "Hello Lua"
local result = string.sub(str, 7)
print(result)
输出 Lua。
使用负数索引
使用负数从字符串尾部开始截取。例如,提取最后 3 个字符。
local str = "Hello Lua"
local result = string.sub(str, -3)
print(result)
输出 Lua。
提取中间一段(混合正负索引)
结合正数和负数索引。例如,提取第 2 个字符到倒数第 2 个字符。
local str = "Hello Lua"
local result = string.sub(str, 2, -2)
print(result)
输出 ello L。
二、全局替换:string.gsub()
string.gsub() 用于在字符串中查找匹配的模式,并将其替换为指定内容。它是 Lua 中最强大的字符串处理函数之一。
1. 基本语法
函数通常接收三个参数:原字符串、匹配模式、替换内容。
string.gsub(s, pattern, repl)
s:原字符串。pattern:查找模式(支持简单的字符串或正则模式)。repl:替换内容。
返回值:该函数返回两个值——替换后的新字符串,以及实际发生的替换次数。
2. 实操步骤
简单文本替换
执行以下代码将 "banana" 中的 "na" 替换为 "TA"。
local str = "banana"
local newStr, count = string.gsub(str, "na", "TA")
print(newStr)
print(count)
输出结果为 baTATA,替换次数为 2。
使用魔法字符进行特殊替换
如果需要替换特殊的正则字符(如 . * + 等),使用 % 进行转义。例如,将 "a.b" 中的 "." 替换为 "!"。
local str = "a.b"
local newStr = string.gsub(str, "%.", "!")
print(newStr)
输出 a!b。
利用捕获组交换内容
gsub 允许使用捕获组(在 pattern 中用 () 括起来)并在替换时引用。%1 表示第一个捕获组,%2 表示第二个。
假设需要将 "Hello World" 中的两个单词交换位置。
local str = "Hello World"
local newStr = string.gsub(str, "(%w+) (%w+)", "%2 %1")
print(newStr)
输出 World Hello。
删除指定内容
将替换内容 repl 设为空字符串 "",即可删除匹配到的内容。
local str = "Phone: 123-456-7890"
local newStr = string.gsub(str, "-", "")
print(newStr)
输出 Phone: 1234567890。
三、进阶应用:清理用户输入
结合 sub 和 gsub,可以构建一个简单的输入清理工具。
场景描述
假设有一段用户输入的文本,包含多余的空格,且我们需要验证前缀是否为特定代码,最后只提取有效数据部分。
代码实现
定义一段包含噪声的字符串:
local raw_input = " ID:1024-user_data "
执行以下步骤进行处理:
- 去除首尾空格(使用
gsub匹配模式%s*)。 - 验证前缀(使用
sub截取前 3 位)。 - 提取有效数据(使用
sub截取冒号后的部分)。
-- 1. 去除首尾所有空格
local trimmed = string.gsub(raw_input, "^%s*(.-)%s*$", "%1")
-- 2. 检查前缀是否为 "ID:"
local prefix = string.sub(trimmed, 1, 3)
local valid_prefix = "ID:"
if prefix == valid_prefix then
-- 3. 去除前缀,获取后续数据
local data = string.sub(trimmed, 4)
-- 4. 格式化输出:将下划线替换为空格
local clean_data = string.gsub(data, "_", " ")
print("验证通过,数据内容: " .. clean_data)
else
print("前缀错误")
end
分析输出结果:
raw_input经过gsub去空格变为ID:1024-user_data。sub截取前 3 位得到ID:,判断为真。sub从第 4 位截取得到1024-user_data。gsub将_替换为空格。- 最终输出:
验证通过,数据内容: 1024 user data。
四、关键参数速查表
下表总结了 string.sub() 和 string.gsub() 的核心参数差异与用法。
| 函数名 | 核心用途 | 参数 1 (Source) | 参数 2 (Start/Pattern) | 参数 3 (End/Repl) | 特殊返回值 |
|---|---|---|---|---|---|
string.sub |
截取子串 | 原字符串 s |
起始索引 i |
结束索引 j (可选) |
仅返回新字符串 |
string.gsub |
全局替换 | 原字符串 s |
匹配模式 pattern |
替换内容 repl |
返回新字符串 + 替换次数 n |
注意:当 string.sub 的索引 i 大于 j 时,或者索引超出实际字符串长度范围时,函数会自动调整到安全范围内,不会报错,而是返回尽可能长的空字符串或子串。

暂无评论,快来抢沙发吧!