Lua字符串库中的⼏个重点函数介绍
在《》中也说到了,要对string库的模式匹配进⾏单独的讲解。对于字符串的处理,对于任何语⾔的学习来说,都是⼀个难点,⽽且也是⼀个必会的知识点。给你⼀个字符串,让你按照某种需求进⾏处理,你不会,那是多么尴尬的⼀件事情。所以,看完《》和这篇⽂章之后,我争取做到让你在处理字符串时,不再感到捉襟见肘,不再尴尬。
说到Lua中的模式匹配,基本上就是围绕着以下⼏个函数展开的:
1.find;
2.match;
3.gsub;
我的总结也就是围绕着上⾯的四个函数展开的。请容我慢慢道来。
简单实⽤的find
string.find()函数⽤于在⼀个给定的⽬标字符串中搜索⼀个模式。最简单的模式就是⼀个单词,它只会匹配与⾃⼰完全相同的拷贝。当find到⼀个模式后,它会返回两个值:匹配到的起始索引和结尾索引;如果没有到任何匹配,它就返回nil。⽰例代码:
复制代码代码如下:
local str = "Hello World"
local i, j = string.find(str, "Hello") -- 返回Hello在str中的起始位置和终⽌位置
print(i, j)
string.find函数还具有⼀个可选的第三个参数,它是⼀个索引,告诉函数应该从⽬标字符串的哪个位置开始搜索。当我们处理⼀个字符串中与给定模式相匹配的所以内容时,这个设置是⾮常有⽤的。我们可以循环的进⾏查操作。当然了,这⾥只是说了最普通,也是最简单的⼀种⽅式,对于第⼆个参数,我们完全可以传递⼀个正则表达式,也就是⼀个pattern,进⾏正则匹配。⽰例代码:
复制代码代码如下:
local str = "Hello12345World"
local i, j = string.find(str, "%d+")
print(i, j) -- 6 10
find的兄弟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呢?
match和find是如此的相近,因此,在实际开发中,按照实际的需要,决定采⽤哪个。
替换利器gsub
string.gsub有3个参数:⽬标字符串、模式和替换字符串。它的基本⽤法是将⽬标字符串中所有出现模式的地⽅替换为⽬标字符串。来看⼀段简短的代码,就什么都明⽩了。
复制代码代码如下:
local str = "Hello World"
local strResult = string.gsub(str, "Hello", "Jelly")
print(strResult) -- Jelly World
另外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) -- 就替换了⼀次
这⾥还有重点需要介绍,也就是gsub的强⼤之处。先看⼀段代码,然后再做介绍。
字符串比较函数实现复制代码代码如下:
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
可以看到,gsub的第三个参数是⼀个table,也就是说,当gsub的第三个参数是⼀个table时,如果在查的字符串中有与第⼆个参数相匹配的内容,就会将该内容作为key,在table中查该key对应的value;如果该table中没有这个key,则不进⾏替换;上⾯的代码就是表明这个意思。接下来再来看⼀
段⽐较神奇的代码:
复制代码代码如下:
local replaceFunc = function (str)
return str .. "JellyThink"
end
local str = "hello world"
-- 注意,第3个参数是⼀个table
local strResult = string.gsub(str, "hello", replaceFunc)
print(strResult) -- helloJellyThink world
没有看错,gsub的第三个参数还可以是⼀个函数,该函数的参数是被匹配的字符串,该函数的返回值将会作为⽬标字符串去进⾏替换匹配的内容。
没法形容的gmatch
我也不知道要怎么形容gmatch,gmatch会返回⼀个迭代器函数,你可以使⽤这个迭代器函数去迭代匹配的所有内容。看下列代码:
复制代码代码如下:
local str = "Hello World"
local iteratorFunc = atch(str, "%a+") -- %a+表⽰匹配所有单词
for i in iteratorFunc do
print(i)
end
如果你对迭代器还不熟悉的话,可以看。我现在就使⽤find来实现⼀个我们⾃⼰的gmatch,功能和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
总结
这⾥就总结到这⾥了,这篇⽂章很详细的⼏个字符串库中我认为⽐较重要的函数。我想我已经总结的很详细了,写了那么多的⽰例代码,应该还好理解。就这样了。希望对⼤家有⽤。最后,我希望⼤家也和我⼀起分享,分享你的学习⼼得,分享你的IT ⼈⽣,期待。。。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论