您的位置:首页 > 编程语言 > Lua

十四、Lua字符串库中的几个重要函数

2016-09-22 22:47 453 查看


Lua字符串库中的几个重要函数|果冻想


本文是对于“果冻想”的《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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: