Lua字符串的利刃:模式匹配的艺术与实践

一、字符串的不可变性与核心函数库

  1. 字符串是不可变的:你不能像在某些语言中那样直接修改字符串的某个字符。所有字符串函数都不会改变原始字符串,而是返回一个新的、修改后的字符串。
  2. string :所有字符串操作都通过全局的 string 表来完成。

二、模式匹配的四个核心函数

1. string.find(s, pattern) -- 查找

它在一个字符串中搜索一个模式,如果找到,返回匹配部分的起始和结束索引 ;否则返回 nil

lua 复制代码
local s = "hello world"
local start_idx, end_idx = string.find(s, "world")
print(start_idx, end_idx) -- 输出: 7   11

local found = string.find(s, "goodbye")
print(found) -- 输出: nil

2. string.match(s, pattern) -- 提取

它与 find 类似,返回匹配到的那部分字符串 。如果模式中包含捕获(captures),它会返回捕获到的内容。

lua 复制代码
local s = "My name is David."
print(string.match(s, "David")) -- 输出: David

-- 使用捕获 () 来提取数字
local text = "Version: 1.2.3"
local version_num = string.match(text, "Version: (%d%.%d%.%d)")
print(version_num) -- 输出: 1.2.3

3. string.gmatch(iterator_s, pattern) -- 迭代

它返回一个迭代器函数,让你可以用 for 循环遍历一个字符串中所有匹配模式的地方。

lua 复制代码
local s = "apple,banana,orange"
-- 提取所有非逗号的单词
for word in string.gmatch(s, "([^,]+)") do
    print(word)
end
-- 输出:
-- apple
-- banana
-- orange

4. string.gsub(s, pattern, replacement) -- 替换

在一个字符串中查找所有匹配模式的地方,并用指定内容进行替换

lua 复制代码
local s = "hello world"
-- 简单替换
local s2 = string.gsub(s, "world", "Lua")
print(s2) -- 输出: hello Lua

-- 进阶:使用捕获进行替换
local date = "2025-10-29"
local formatted_date = string.gsub(date, "(%d+)-(%d+)-(%d+)", "%3/%2/%1")
print(formatted_date) -- 输出: 29/10/2025

-- 终极:使用函数进行替换
local text = "I have 3 apples and 5 oranges."
local new_text = string.gsub(text, "(%d+)", function(n)
    return n * 2 -- 将所有数字翻倍
end)
print(new_text) -- 输出: I have 6.0 apples and 10.0 oranges.

三、模式语法速查手册

Lua 的模式由普通字符和一些具有特殊含义的"魔法字符"组成。

  • .: 匹配任意单个字符。
  • %a: 匹配任意字母。
  • %d: 匹配任意数字。
  • %s: 匹配任意空白字符(空格、制表符、换行等)。
  • %w: 匹配任意字母和数字。
  • %l / %u: 匹配任意小写 / 大写字母。
  • 大写字母 (%A, %D, %S, %W): 匹配对应小写版本的补集 (例如 %D 匹配任何非数字字符)。
  • [set] : 匹配集合 set 中的任意字符(例如 [abc])。
  • [^set] : 匹配任意不在 集合 set 中的字符。
  • (pattern) : 捕获 。将匹配 pattern 的子字符串捕获,用于 matchgsub
  • % : 转义字符。用于匹配魔法字符本身,例如 %. 匹配一个真正的点,%% 匹配一个百分号。

重复匹配修饰符 (Modifiers):

  • *: 匹配前一个字符或类别 0 次或多次(贪婪模式,匹配尽可能长的)。
  • +: 匹配 1 次或多次(贪婪模式)。
  • ?: 匹配 0 次或 1 次。
  • - : 匹配 0 次或多次(非贪婪模式 ,匹配尽可能短的)。这是 * 的一个非常有用的变体。

边界匹配:

  • ^: 匹配字符串的开头。
  • $: 匹配字符串的结尾。

结语

点个赞,关注我获取更多实用 Lua 技术干货!如果觉得有用,记得收藏本文!

相关推荐
weixin_382395233 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__3 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.4 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~5 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华6 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子8 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅8 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni9 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学10 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端