Chapter 21_2 模式匹配函数
基础函数比较简单,就是几个普通的函数string.byte、string.char、string.rep、string.sub、string.format还有大小写转换函数upper和lower。
接下来介绍最强大的函数,find、match、gsub、和gmatch,它们都是基于“模式(pattern)”的。
不同于其他脚本语言,Lua既没有用POSIX,也没有使用Perl正则表达式来进行模式匹配。主要因为考虑到Lua的大小。
POSIX需要超过4000多行代码,相当于所有Lua标准库加在一起的大小。
相比之下,Lua采用的不到500行。虽然功能上达不到完整的POSIX实现。但是也是一个强大的工具,甚至有些特性比POSIX更为方便。
- find 函数
该函数用于在给定的目标字符串中搜索一个模式。最简单的就是一个单词,它只会匹配与自己完全相同的拷贝。
例如:模式“hello” 会搜索目标中的子串“hello”。找到后,返回两个值:一个起始索引、一个结尾索引。没有找到就返回nil。
s = "hello world"
i , j = string.find(s,"hello")
print(i , j ) --> 1 5
print(string.sub(s , i , j )) --> hello --用简单函数里的sub 截取i 到 j 的字符串,这样的简单模式,取出的就是模式自身
print(string.find(s , "world")) --> 7 11
i , j = stirng.find(s , "l")
print(i , j ) --> 3 3 -- 起始为索引3,结尾也为索引3
print(string.find(s , "lll")) --> nil
find函数还有一个可选的第三个参数,它是一个索引,告诉函数应从目标字符串的哪个位置开始搜索。
当处理所有与给定模式相匹配的部分时,这个参数很有用。可以重复搜索新的匹配,且每次搜索都从上一次找到的位置开始。
下面的例子用字符串中所有换行符的位置创建了一个table:
local t = {} --存储索引的table
local i =
while true do
i = string.find( s , "\n" , i + ) --找下一行
if i == nil then break end
t[#t + ] = i
end
- match函数
该函数与find非常相似,也是用在一个字符串中搜索一种模式。
不同之处在于,match返回的是目标字符中与模式匹配的那部分子串,而非所在位置。
print(string.match("hello world","hello")) -->hello
像这样固定的模式,用这个函数就没有什么意义了。
当使用变量模式时,特性就显现出来了:
date = "Today is 22/9/2016"
d = string.match(date , "%d+/%d+/%d+") -- + 符号表示匹配一或多个该类的字符
print(d) --> 22/9/2016
- gsub函数
它有3个参数:目标字符串、模式、替换字符串。
将目标字符串中所有出现模式的地方替换为替换字符串。
s = string.gsub("Lua is cute", "cute", "great")
print(s) --> Lua is great
s = string.gsub("all lii" , "l" , "x")
print(s) --> axx xii
s = string.gsub("Lua is great" , "Sol" , "Sun") --没有找到,返回false或nil 时不作替换(保留匹配前的原始串)
print(s) --> Lua is great
它还有第四个可选参数,可以限制替换的次数:
s = string.gsub("all lii" , "l" ,"x", ) --替换1次
print(s) --> axl lii
s = string.gsub("all lii " , "l" , ) --替换2次
print(s) --> axx lii
它还有第二个结果,即实际替换的次数。例如,以下代码就是一种统计字符串中空格数量的简单方法:
count = select(,string.gsub(str , " "," ")) --select函数,返回第2个之后的部分
简单明了的方法:
s = "he ll o wo rld"
a,count = string.gsub(s," " ," ")
print(a , count ) -->he ll o wo rld 4
- gmatch函数
返回一个函数,通过这个返回的函数可以遍历到一个字符串中所有出现指定模式的地方,下面代码找出了给定字符串s中所有的单词:
words = {}
for w in string.gmatch(s , "%a+") do -- %a+ 表示一个或多个任意字母,也就是单词。
words[#words + ] = w
end
通过gmatch和gsub可以模拟出Lua中的require在寻找模块时所用的搜索策略:
function search(modname , path)
modname = string.gsub(modname , "%.","/") --用目录分隔符"/"替换所有的“.”
for c in string.gmatch(path,"[^;]+") do -- 不包括“;”的最长子串
local fname = string.gsub(c,"?",modname) --对于每个子串中的“?”,都用模块名曲替换,以此获得最终的文件名。
local f = io.open(fname)
if f then
f:close()
return fname
end
end
return nil --not found
end
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》
Chapter 21_2 模式匹配函数的更多相关文章
- Chapter 21_1 字符串函数
接下来开始接触Lua强大的字符串处理能功能——字符串库. 原始的Lua解释器操作字符串的能力很有限,真正强大的能力还是来自字符串库. 它所有的函数都在模块string中.它还为strings设置了一个 ...
- Chapter 17_2 备忘录函数
一项通用的编程技术:用空间换时间. 例如有一种做法就可以提高一些函数的运行速度,记录下函数计算的结果,当再次调用该函数时,便可以复用之前的结果. 比如,一个普通服务器,在它收到请求中包含Lua代码,会 ...
- Chapter 15_1 require函数
Lua提供了一个名为require的高层函数来加载模块,但这个函数只假设了关于模块的基本概念. 对于require而言,一个模块就是一段定义了一些值(函数或者包含函数的table)的代码. 为了加载一 ...
- KMP模式匹配_2
http://blog.csdn.net/lin_bei/article/details/1252686 三. 怎么求串的模式值next[n] 定义: (1)next[0]= -1 意义:任何串的第一 ...
- lua string函数
lua的string函数: 参数中的index从1开始,负数的意义是从后开始往前数,比如-1代表最后一个字母 对于string类型的值,可以使用OO的方式处理,如string.byte(s.i)可以被 ...
- KMP字符串模式匹配详解(转)
来自CSDN A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度 ...
- lua的string库与强大的模式匹配
lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库.lua的string函数导出在string module中.在lua5.1,同一时候也作为string类型的成 ...
- Haskell 笔记(四)函数系统
函数系统 函数式编程当然少不了函数系统啦,在教程最初的时候就有一个最简单的函数,函数系统贯穿在Haskell全部,Haskell的函数有几个重要的性质. 首先声明一下函数的参数和返回值类型 然后有一个 ...
- Spark记录-Scala模式匹配
Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...
随机推荐
- IOS学习之路五(SpriteKit 开发飞机大战小游戏一)
参考SpriteKit 创建游戏的教程今天自己动手做了一下,现在记录一下自己怎么做的,今天之做了第一步,一共有三个部分. 第一步,项目搭建. 项目所用图片资源:点击打开链接 1.在Xcode打开之后, ...
- 常用的免费Webservice接口
快递查询接口 http://webservice.36wu.com/ExpressService.asmx ip查询接口 http://webservice.36wu.com/ipService.a ...
- 搜狗主页页面CSS学习小记
1.边框的处理 要形成上图所示的布局效果,即,点选后,导航下面的边框不显示而其他的边框形成平滑的形状.相对于把导航的下面边框取消然后用空白覆盖掉下面搜索栏的边框比较而言,sougou有很好的方法来 ...
- Jira 6.0.5环境搭建
敏捷开发-Jira 6.0.5环境搭建[1] 我的环境 Win7 64位,MSSql2008 R2,已经安装tomcat了 拓展环境 jira 6.0.5 百度网盘下载 ...
- Supervisor 管理后台守护进程
Supervisor 管理后台守护进程 参考原文如下: http://codinn.com/people/brant/notes/110948/ 做了一些注释 +++++++++++引用开始+++++ ...
- PHP使用DomDocument抓取HTML内容
有时候会有需要从一个HTML页面来分离出你需要的一些数据来进行处理. 当然自己分析文件肯定可以,但是比较快速且方便的是使用正则表达式或者DOM. 鉴于正则表达式我不熟悉,所以我打算使用DOM来完成. ...
- [置顶] 使用Android OpenGL ES 2.0绘图之六:响应触摸事件
传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...
- MVC实现省级联动
前言 省级联动的效果,网上现成的都有很多,各种JS实现,Jquery实现等等,今天我们要讲的是在MVC里面,如何更方便.更轻量的实现省级联动呢? 实现效果如下: 具体实现 如图所示,在HTML页非常简 ...
- 浅谈敏捷组织中PMO的角色
所谓的"敏捷组织"其实并没有标准的模式,而且PMO(项目管理办公室)并没有一个标准的角色定义.有一个非常普遍的误解,公司在选择"敏捷"或者"瀑布&qu ...
- ArrayList 、LinkList区别以及速度对比
概论 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList优于LinkedList,因为Arra ...