在《Lua中的一些库》中也说到了,要对string库的模式匹配进行单独的讲解。对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点。给你一个字符串,让你按照某种需求进行处理,你不会,那是多么尴尬的一件事情。所以,看完《Lua中的一些库》和这篇文章之后,我争取做到让你在处理字符串时,不再感到捉襟见肘,不再尴尬。
说到Lua中的模式匹配,基本上就是围绕着以下几个函数展开的:
1.find;
2.match;
3.gsub;
4.gmatch。
我的总结也就是围绕着上面的四个函数展开的。请容我慢慢道来。
简单实用的find
string.find()函数用于在一个给定的目标字符串中搜索一个模式。最简单的模式就是一个单词,它只会匹配与自己完全相同的拷贝。当find找到一个模式后,它会返回两个值:匹配到的起始索引和结尾索引;如果没有找到任何匹配,它就返回nil。示例代码:
local str = "Hello World" local i, j = string.find(str, "Hello") -- 返回Hello在str中的起始位置和终止位置 print(i, j)
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呢?
替换利器gsub
string.gsub有3个参数:目标字符串、模式和替换字符串。它的基本用法是将目标字符串中所有出现模式的地方替换为目标字符串。来看一段简短的代码,就什么都明白了。
local str = "Hello World" local strResult = string.gsub(str, "Hello", "Jelly") print(strResult) -- Jelly World
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) -- 就替换了一次
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
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 = string.gmatch(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人生,期待。。。
本文向大家介绍Lua中的string库(字符串函数库)总结,包括了Lua中的string库(字符串函数库)总结的使用技巧和注意事项,需要的朋友参考一下 Lua解释器对字符串的支持很有限。一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容。在Lua中操纵字符串的功能基本来自于string库。 字符串库中的一些函数是非常简单的: string.len(s)
本文向大家介绍Lua中table库函数方法介绍,包括了Lua中table库函数方法介绍的使用技巧和注意事项,需要的朋友参考一下 一部分的table函数只对其数组部分产生影响, 而另一部分则对整个table均产生影响. 下面会分开说明. table.concat(table, sep, start, end) concat是concatenate(连锁, 连接)的缩写. table.concat(
本文向大家介绍JavaScript截取字符串的2个函数介绍,包括了JavaScript截取字符串的2个函数介绍的使用技巧和注意事项,需要的朋友参考一下 首先我们来看一下substring函数使用介绍。 一、substring substring需要至少需要一个参数,第一个参数为起始位置,第二个参数可选,为结束位置。 只有一个参数: 两个参数: 二、substr substr同样至少需要一个参数,第
主要内容:实例,字符串操作,实例,实例,实例,实例,实例,实例,实例,实例字符串或串(String)是由数字、字母、下划线组成的一串字符。 Lua 语言中字符串可以使用以下三种方式来表示: 单引号间的一串字符。 双引号间的一串字符。 [[ 与 ]] 间的一串字符。 以上三种方式的字符串实例如下: 实例 string1 = "Lua" print ( "\"字符串 1 是\"" ,string1 ) string2 = 'xnip.cn' print ( "字符串 2 是
字符串或串(String)是由数字、字母、下划线组成的一串字符。 Lua 语言中字符串可以使用以下三种方式来表示: 单引号间的一串字符。 双引号间的一串字符。 [[和]]间的一串字符。 以上三种方式的字符串实例如下: string1 = "Lua" print("\"字符串 1 是\"",string1) string2 = 'runoob.com' print("字符串 2 是",string
本文向大家介绍写一个字符串重复的repeat函数相关面试题,主要包含被问及写一个字符串重复的repeat函数时的应答技巧和注意事项,需要的朋友参考一下