十四、Lua字符串库中的几个重要函数
2016-09-22 22:47
453 查看
Lua字符串库中的几个重要函数|果冻想
find
string.find()函数用于在一个给定的目标字符串中搜索一个模式。local str = "Hello World"
local i, j = string.find(str, "Hello") -- 返回Hello在str中的起始位置和终止位置
print(i, j) -- 1 5
local k, v = string.find(str, "haha") -- 没有找到匹配,返回nil
print(k, v) -- nil nil
第二个参数可以传递一个正则表达式,也就是一个pattern,进行正则匹配。
local str = "Hello123456World"
local i, j = string.find(str, "%d+")
print(i, j) -- 6 11
match
string.match与string.find相似,但是string.match返回的是所匹配的字符串。local str = "Hello12345World"
local subStr = string.match(str, "%d+")
print(subStr)
local i, j =string.find(str, "%d+")
subStr =string.sub(str, i, j)
print(subStr)
-- 是不是可以认为match等于find + sub呢?
gsub
string.gsub有三个参数:目标字符串、模式和替换字符串。local str = "Hello World"
local strResult = string.gsub(str, "Hello", "Jelly")
print(strResult) -- Jelly World
string.gsub有可选的第四个参数,可以限制替换的次数。
local str = "Hello World"
-- 这里不限制替换次数
local strResult, cnt = string.gsub(str, "l", "o")
print(strResult) -- Heooo Worod
print(cnt) -- 实际替换的次数
-- 开始限制替换次数
strResult, cnt = string.gsub(str, "l", "o", 1)
print(strResult) -- Heolo World
print(cnt) -- 就替换了一次
更强大的地方是,它的第三个参数可以是table或函数:
参数是table
local replaceTb = {hello = "Jelly", world = "Think"}
local str = "hello world"
-- 注意,第3个参数是一个table
local strResult = string.gsub(str, "hello", replaceTb)
print(strResult) -- Jelly world
strResult = string.gsub(strResult, "world", replaceTb)
print(strResult) -- Jelly Think
strResult = string.gsub(strResult, "hello", replaceTb)
print(strResult) -- Jelly Think
参数是function
local replaceFunc = function (str)
return str .. "JellyThink"
end
local str = "hello world"
-- 注意,第3个参数是一个Func
local strResult = string.gsub(str, "hello", replaceFunc)
print(strResult) -- helloJellyThink world
gmatch
gmatch会返回一个迭代器函数,你可以使用这个迭代器函数区迭代匹配的所有内容。local str = "Hello World"
local iteratorFunc = string.gmatch(str, "%a+") -- %a+表示匹配所有单词
for i in iteratorFunc do
print(i)
end
自己实现一个gmatch:
local str = "Hello World"
-- 使用find来实现一个自己的gmatch
local myGmatch = function (s, pattern)
local resultTb = {} -- 相当于迭代器中的恒定状态
local index = 0 -- 相当于迭代器中的控制变量
local i, j = string.find(s, pattern)
while i do
resultTb[#resultTb + 1] = string.sub(s, i, j)
i, j = string.find(s, pattern, j + 1)
end
return function () -- 返回一个迭代器函数
index = index + 1
return resultTb[index]
end
end
for i in myGmatch(str, "%a+") do
print(i)
end
相关文章推荐
- 十三、Lua中的一些库
- lua关于require和package.loaded常被忽略的故事
- Lua1.1 虚拟机指令分析
- lua_code_cache off/on
- Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
- Lua和C++交互 学习记录之八:C++类注册为Lua模块
- Lua手册
- Lua学习系列(五)
- 从unpack到lua版本的坑
- Lua 标准库 - 输入输出处理(input and output facilities)
- tolua++ 返回值
- Lua学习系列(四)
- Lua学习系列(三)
- lua指令
- Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块
- Ubuntu安装lua5.3.3
- evaluate-reverse-polish-notation(逆波兰表示求值)
- Lua和C++交互 学习记录之六:全局函数交互
- Lua学习系列(二)
- Lua中实现table的打印输出(print table)