文章目录

Lua 字符串操作:string.sub() 与 string.gsub()

发布于 2026-04-11 01:19:56 · 浏览 9 次 · 评论 0 条

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


三、进阶应用:清理用户输入

结合 subgsub,可以构建一个简单的输入清理工具。

场景描述

假设有一段用户输入的文本,包含多余的空格,且我们需要验证前缀是否为特定代码,最后只提取有效数据部分。

代码实现

定义一段包含噪声的字符串:

local raw_input = "  ID:1024-user_data   "

执行以下步骤进行处理:

  1. 去除首尾空格(使用 gsub 匹配模式 %s*)。
  2. 验证前缀(使用 sub 截取前 3 位)。
  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 时,或者索引超出实际字符串长度范围时,函数会自动调整到安全范围内,不会报错,而是返回尽可能长的空字符串或子串。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文