Lua字符串库中的几个重点函数介绍_Lua

在《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)

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 = 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人生,期待。。。

时间: 2024-11-01 22:30:32

Lua字符串库中的几个重点函数介绍_Lua的相关文章

Lua中的迭代器和泛型for介绍_Lua

任何一种结构,只要允许你遍历集合中所有元素的都可称之为迭代器.lua中常常使用函数来描述迭代器,每次调用该函数都返回集合的下一个元素.每一个迭代器都需要保存一些状态来知道当前处于什么位置和如何进行下一次迭代.对于这样的任务,闭包提供了很好的机制来完成.一个典型的闭包结构包含两个函数:一个是闭包自身,一个是创建闭包的工厂. 例如,我们可以写过简单的list迭代器,让他仅仅返回值. 复制代码 代码如下: function values( t )      local i = 0;      retu

Lua中全局变量与非全局环境介绍_Lua

今天来聊两个话题--全局变量和非全局环境. 正如大家目前心里所感受到的,全局变量的内容很简单,而非全局环境的内容就稍微要锻炼一下脑细胞了. 1.全局变量的原形 在Lua中,要声明全局变量很简单,那就是定义变量的时候,前面不要加上local. 这个神秘的全局变量,其实本质上也是一个table,它把我们创建的全局变量都保存到一个table里了. 而这个table的名字是:_G   我们来看看代码: 复制代码 代码如下:     -- 定义一个全局变量     gName = "哎哟,很挫哦"

php中常用文件操作读写函数介绍

用 PHP 内置函数 file_exists 可以检查某个文件或目录是否存在.如果文件或目录存在,file_exists 函数返回 TRUE,如果不存在,则返回 FALSE. 下面是一个简单的检查文件是否存在的实例代码:  代码如下 复制代码 <html><body><?php $filename = "C:\blabla\php\hello.txt"; if (file_exists($filename))  {echo "The file $

Lua获取文件长度和判断文件是否存在函数分享_Lua

获得文件长度 复制代码 代码如下:  function length_of_file(filename)   local fh = assert(io.open(filename, "rb"))   local len = assert(fh:seek("end"))   fh:close()   return len end 判断文件是否存在 复制代码 代码如下: function file_exists(path)   local file = io.open(

Lua教程(三):值与类型介绍_Lua

Lua 是一种 动态类型语言. 这意味着变量没有类型,只有值才有类型. 语言中不存在类型定义.而所有的值本身携带它们自己的类型信息. Lua 中的所有值都是一致 (first-class) 的. 这意味着所有的值都可以被放在变量里,当作参数传递到另一个函数中,并被函数作为结果返回. Lua 中有八种基本类型: nil, boolean, number, string, function, userdata, thread, and table. Nil 类型只有一种值 nil ,它的主要用途用于

Lua所有内置函数罗列_Lua

在大多数Lua语法分析中可以获得这些标准Lua函数. 无可争辩, 我们可以查阅Lua网站, 但是一些少了的函数被Blizzard进行了调整. 下面列出了所有Lua函数. WoW API中的Lua注意在WoWAPI没有提供所有标准的Lua函数, 很显然, 操作系统以及文件I/O库是不支持的 Lua函数这些函数都是Lua编程语言的一部分, 点击这里了解更多. •assert(value) - 检查一个值是否为非nil, 若不是则(如果在wow.exe打开调试命令)显示对话框以及输出错误调试信息 •c

Lua极简入门指南(一):函数篇_Lua

Lua 和其他很多语言一样,函数调用时参数列表被包裹在括号中: 复制代码 代码如下: print('Hello World') 特别的情况是,如果函数调用时只有一个参数,并且此参数为字符串 literal(字面量)或者 table 构造器(constructor)时,包裹参数的括号可以省略: 复制代码 代码如下: print 'Hello World' <--> print('Hello World') type{}              <--> type({}) Lua 为

Lua教程(十四):字符串库详解_Lua

1. 基础字符串函数:     字符串库中有一些函数非常简单,如:     1). string.len(s) 返回字符串s的长度:     2). string.rep(s,n) 返回字符串s重复n次的结果:     3). string.lower(s) 返回s的副本,其中所有的大写都被转换为了小写形式,其他字符不变:     4). string.upper(s) 和lower相反,将小写转换为大写:     5). string.sub(s,i,j) 提取字符串s的第i个到第j个字符.L

Lua编程示例(四):Lua标准库之表库、字符串库、系统库_Lua

tb1 = { "alpha","log","gamme"} print(table.concat(tb1," , ")) print(table.concat(tb1,"\n",nil,2)) print() tb1[88.99] = 'aaa' --返回索引值最大的值,并且计算小数 print(table.maxn(tb1)) print() --默认删除索引最大的元素并返回 print(table.r