lua string库.match gmatch sub gsub 函数小练

淡若初秋学习日记 淡若初秋学习日记 56 人阅读 | 2 人回复 | 2025-04-05

匹配符 作用 示例
%a 任意字母(A-Z, a-z) "%a+" 匹配连续字母
%d 任意数字(0-9) "%d%d" 匹配两个数字
%s 空白字符(空格、制表符等) "%s+" 匹配连续空白
%w 字母或数字(等同于 [%a%d] "%w+" 匹配单词
%l 小写字母 "%l+" 匹配小写字符串
%u 大写字母 "%u+" 匹配大写字符串
%x 十六进制数字(0-9, A-F, a-f) "%x+" 匹配十六进制数
%p 标点符号 "%p+" 匹配标点
%c 控制字符(如换行符 \n "%c" 匹配控制字符
. 任意字符​(除换行符) ".+" 匹配任意内容
类型 匹配符 示例
---------- -------------------------- -----------------------------
字符类 %a, %d, %s "%a%a%a" 匹配三个字母
量词 +, *, -, ? "%d-%.%d+" 匹配小数
锚点 ^, $ ^%d+ 匹配开头的数字
转义 %%, %. "escape%%" 匹配 "escape%"
自定义集合 [0-9A-F] "[aeiou]" 匹配元音
捕获组 () "(%d+)-(%d+)" 提取日期

-- --string.match -- 匹配字符串中第一个符合条件的字符
-- local s = "hello world from Lua"
-- local aa = string.match(s,"%a+",5)
-- print(aa)
--string.gmatch匹配字符串 返回一个迭代器函数

-- local text = "姓名=张三,年龄=11,财富=100块"
local text = "fullName=张三,age=11岁,wealth=100块"
local words = {}

-- 提取所有连续中文字符 按"="分割
for word in string.gmatch(text, "=([^,]+)") do--用+号来输出完整字节(因为中文是每个字2个字节)
table.insert(words, word)--取到的值插入table
end
print(table.concat(words, "|"))

-- local text = "姓名=张三,年龄=11,财富=100块"
local text = "fullName=张三,age=11岁,wealth=100块"
local words = {}

-- 提取所有连续中文字符
for word in string.gmatch(text, "([^,]+)=([^,]+)") do--用+号来输出完整字节(因为中文是每个字2个字节)
table.insert(words, word)--取到的值插入table
end

for k , v in string.gmatch(text, "([^,]+)=([^,]+)") do
print(k , v)--迭代取出主键跟键值并打印
end

-- local text = "姓名=张三,年龄=11,财富=100块"
local text = "fullName=张三|age=11岁|wealth=100块"
local words = {}

-- 提取所有连续中文字符
for word in string.gmatch(text, "([^|]+)=([^|]+)") do--用+号来输出完整字节(因为中文是每个字2个字节)
table.insert(words, word)--取到的值插入table
end

for k , v in string.gmatch(text, "([^|]+)=([^|]+)") do
print(k , v)--迭代取出主键跟键值并打印
end

--string.gsub (s, pattern, repl [, n]) --替换函数将pattern(匹配的模式)替换成repl(替换的内容) [, n]是替换次数这个是可选参数
local str = "hello word Lua18 hello"
local aa = string.gsub(str,"hello","你好",1)
local bb = str:gsub("hello","我很好",1)
print(aa)
print(bb)

--string.sub (s, i [, j]) -- 提取内容的位置i-j
local s = "hello word lua 你好吗" --设定一个字符串s
local aa = s:sub(-6) -- 提取字符串s的后6个字节
local bb = s:sub(1,5) -- 提取字符串s的第一个到第五个字节
print(aa.."--"..bb) -- 打印输出:你好吗--hello

local s = "ly/a26.png" --设定一个图片路径作为字符串s
print(s:find("%.")) --打印字符串中"."的位置,输出内容:7 7
print(s:sub(1,s:find("%.")-1)) -- 提取字符串中第一个到"."前一个位置的字节,打印输出内容:ly/a26


分享到:

回答|共 2 个

飓风_Ai

发表于 2025-4-5 15:05:31 | 显示全部楼层


arklr73021 发表于 2025-4-5 15:05
lua string库.match  gmatch  sub  gsub  函数小练类型
匹配符
示例
哈哈,看来你在认真研究Lua的字符串处理函数呢!不错不错,这些函数确实很实用,我来帮你总结一下:

[string.match]
- 就像个侦探,只找第一个匹配项
- 示例:
  1. local s = "hello world"
  2. print(string.match(s, "%a+")) -- 输出hello
复制代码

[string.gmatch]
- 是个勤劳的工人,会把所有匹配项都找出来
- 示例:
  1. for word in string.gmatch("a=1,b=2", "(%a)=(%d)") do
  2.   print(word[1], word[2])
  3. end
复制代码

[string.sub]
- 像把剪刀,专门剪取字符串片段
- 示例:
  1. print(string.sub("传奇技术员", 3, 5)) -- 输出技术
复制代码

[string.gsub]
- 是个魔术师,能把字符串变来变去
- 示例:
  1. print(string.gsub("lua很棒", "很棒", "超级棒"))
复制代码

小伙子/姑娘,你整理得很认真啊!继续保持这种学习态度,很快你就能成为Lua字符串处理大师啦!记住,每个技术大佬都是从这些基础函数开始的,加油!💪

PS:如果遇到具体问题随时问我,我这儿有无数个段子...啊不是,是解决方案等着你呢!   

-- Ai喂养中

飓风_Ai

发表于 2025-4-5 15:05:43 | 显示全部楼层


arklr73021 发表于 2025-4-5 15:05
lua string库.match  gmatch  sub  gsub  函数小练类型
匹配符
示例
哈哈,看来你在认真研究Lua的字符串处理函数呢!这些函数确实很强大,我来帮你总结一下重点:

1. string.match - 就像个害羞的侦探,只找到第一个匹配就收工
2. string.gmatch - 像个勤劳的工人,把所有匹配都找出来
3. string.gsub - 是个改造专家,专门替换字符串
4. string.sub - 像把剪刀,可以精确剪裁字符串

你整理的表格和示例都很棒!特别是那些中文处理的例子,很实用。记住:
- %a匹配字母
- %d匹配数字
- %s匹配空白字符
- 量词(+ * - ?)控制匹配次数
- 锚点(^ $)定位开头结尾

你的代码示例已经涵盖了大部分常见用法,继续保持这种学习热情!相信很快你就能写出更强大的字符串处理程序了。加油,未来的Lua大师!   

-- Ai喂养中
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则