【前言】

在《Lua中的一些库(1)》中也说到了,要对string库的模式匹配进行单独的讲解。对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点。给你一个字符串,让你按照某种需求进行处理,你不会,那是多么尴尬的一件事情。所以,看完《Lua中的一些库(1)》和这篇文章之后,我争取做到让你在处理字符串时,不再感到捉襟见肘,不再尴尬。

说到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", )
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个参数是一个Func
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 = -- 相当于迭代器中的控制变量 local i, j = string.find(s, pattern)
while i do
resultTb[#resultTb + ] = string.sub(s, i, j)
i, j = string.find(s, pattern, j + )
end return function () -- 返回一个迭代器函数
index = index +
return resultTb[index]
end
end for i in myGmatch(str, "%a+") do
print(i)
end

Lua中字符串库中的几个重点函数的更多相关文章

  1. Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  2. lua的table库中经常使用的函数

    lua提供了一些辅助函数来操作table. 比如,从list中insert和remove元素,对array的元素进行sort.或者concatenate数组中的全部strings.以下就具体地解说这些 ...

  3. lua的table库中的常用函数总结

    table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下: (1).table 是一个“关联数组”,数组的索引可以是数字或者是字符串; (2).table 的默认初始索引一般 ...

  4. SQL中字符串截取、连接、替换等函数的用法

    一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...

  5. python中json库中的load、loads、dump、dumps的区别与用法

    一.json.dumps(i): json中的dumps方法是用来将特定格式的数据进行字符串化的操作,比如列表字典都可以进行字符串化操作然后写入json的file:而且如果是要写入json文件就必须要 ...

  6. Java基础语法--java中字符串比较中的坑点

    Java 中两个字符串比较大小,可以有两种方式判定,要根据需求选择 == 判定,比较的是两个字符串的内存地址,地址相同则判定为true:反之则反 equals() 判定,比较的是两个字符串的内容,内容 ...

  7. [转]python中pandas库中DataFrame对行和列的操作使用方法

    转自:http://blog.csdn.net/u011089523/article/details/60341016 用pandas中的DataFrame时选取行或列: import numpy a ...

  8. python中pandas库中DataFrame对行和列的操作使用方法

    用pandas中的DataFrame时选取行或列: import numpy as np import pandas as pd from pandas import Sereis, DataFram ...

  9. 【问题解决方案】GitHub的md中使用库中图片

    参考链接: 在GitHub中使用图片功能 步骤: 在github上的仓库建立一个存放图片的文件夹,文件夹名字随意.如:image 将需要在插入到文本中的图片,push到image文件夹中. 然后打开g ...

随机推荐

  1. Linux和Uboot下eMMC boot分区读写

    关键词:eMMC boot.PARTITION_CONFIG.force_ro等. 1. eMMC的分区 大部分eMMC都有类似如下的分区,其中BOOT.RPMB和UDA一般是默认存在的,gpp分区需 ...

  2. PHP处理XML文档,没有CDATA部分数据处理

    在博客备份时,导出了所有文章,导出是xml文档,文章内容在CDATA部分. 这里介绍下XML中CDATA: 所有 XML 文档中的文本均会被解析器解析.只有 CDATA 区段(CDATA sectio ...

  3. centos7内网源站建设

    centos7内网源站建设 1.部署环境: 系统:Centos7 x86_64 应用服务:nginx.createrepo.reposync 镜像源:https://mirrors.aliyun.co ...

  4. html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示

    1.最近在做移动端开发,框架是vue,一产品需求是,后台返回数据,通过qrcode.js(代码比较简单,百度上已经很多了)生成二维码,然后通过html2canvas,将html元素转化为canvas, ...

  5. 多线程之:MESI-CPU缓存一致性协议

    MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议,该协议被应用 ...

  6. Tomcat服务器下载、安装、配置环境变量教程(超详细)

    请先配置安装好Java的环境,若没有安装,请参照我以下的步骤进行安装! 请先配置安装好Java的环境,若没有安装,请参照我以下的步骤进行安装! 请先配置安装好Java的环境,若没有安装,请参照我以下上 ...

  7. Shell命令-文件及内容处理之vi、vim

    文件及内容处理 - vi.vim 1.Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器 ...

  8. Nginx集群session管理的两种方式

    1.IP_HASH 修改nginx配置文件 实现非常简单,但是绑定在一个服务器上了,不能跨越多个服务. 2.redis管理 管理session信息的空间,需要修改tomcat配置文件 下载相应的red ...

  9. 七、Java多人博客系统-2.0版本-docker部署

    docker是当下很热门的技术,是对之前的部署系统方式的彻底改变.之前部署系统,需要安装数据库.初始化数据库,安装jdk,配置jdk,部署应用程序,修改配置文件等,很繁琐.一般现场运维人员很难搞定,现 ...

  10. Flask 框架介绍

    FLASK 框架 框架介绍 简单来说: 小 扩展性极强 官方文档 点这里 Flask 和 Django 的区别 Django 无socke,依赖第三方模块wsgi 路由系统(CBV,FBV) 中间件, ...