基础函数比较简单,就是几个普通的函数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 模式匹配函数的更多相关文章

  1. Chapter 21_1 字符串函数

    接下来开始接触Lua强大的字符串处理能功能——字符串库. 原始的Lua解释器操作字符串的能力很有限,真正强大的能力还是来自字符串库. 它所有的函数都在模块string中.它还为strings设置了一个 ...

  2. Chapter 17_2 备忘录函数

    一项通用的编程技术:用空间换时间. 例如有一种做法就可以提高一些函数的运行速度,记录下函数计算的结果,当再次调用该函数时,便可以复用之前的结果. 比如,一个普通服务器,在它收到请求中包含Lua代码,会 ...

  3. Chapter 15_1 require函数

    Lua提供了一个名为require的高层函数来加载模块,但这个函数只假设了关于模块的基本概念. 对于require而言,一个模块就是一段定义了一些值(函数或者包含函数的table)的代码. 为了加载一 ...

  4. KMP模式匹配_2

    http://blog.csdn.net/lin_bei/article/details/1252686 三. 怎么求串的模式值next[n] 定义: (1)next[0]= -1 意义:任何串的第一 ...

  5. lua string函数

    lua的string函数: 参数中的index从1开始,负数的意义是从后开始往前数,比如-1代表最后一个字母 对于string类型的值,可以使用OO的方式处理,如string.byte(s.i)可以被 ...

  6. KMP字符串模式匹配详解(转)

    来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度 ...

  7. lua的string库与强大的模式匹配

    lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库.lua的string函数导出在string module中.在lua5.1,同一时候也作为string类型的成 ...

  8. Haskell 笔记(四)函数系统

    函数系统 函数式编程当然少不了函数系统啦,在教程最初的时候就有一个最简单的函数,函数系统贯穿在Haskell全部,Haskell的函数有几个重要的性质. 首先声明一下函数的参数和返回值类型 然后有一个 ...

  9. Spark记录-Scala模式匹配

    Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...

随机推荐

  1. C#利用Emit反射实现AOP,以及平台化框架封装思路

    C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...

  2. IIS日志字段详解

    IIS日志字段详解 抓住8月的尾巴,弥补下这个月的空白,事情太多,忘了写博客这回事了. IIS日志字段设置                                          网站运营时 ...

  3. C# 根据路线点集合动态分段

    /// <summary>         /// 将数据根据起.止点分段,返回结果点集合         /// </summary>         public Obse ...

  4. Cloudera Development Kit(CDK) 简介

    Cloudera Development Kit(CDK) 简介 guibin.beijing@gmail.com 2013.07.02 CDK简介 CDK(Cloudera Development ...

  5. Windows 8.1 Preview的新功能和新API

    http://msdn.microsoft.com/en-us/library/windows/apps/bg182410 App打包 新的App程序包将使App的提交更简单.资源包可以让你提供附加的 ...

  6. java参数传递(值传递还是引用传递)

    Java中的参数传递机制一直以来大家都争论不休,究竟是“传值”还是“传址(传引用)”,争论的双方各执一词,互不相让.不但“菜鸟”们一头雾水,一些“老鸟”也只知道结果却说不出所以然来.我相信看过下面的内 ...

  7. 高频交易算法研发心得--RSI指标及应用

    高频交易算法研发心得--RSI指标及应用 前面文章中我们提到了MA均线(包括EMA,SMA).MACD以及SAR指标,这三类指标存在一个共同特点,即:从固定周期的价格作为判读的指导思想,并将价格进行平 ...

  8. springmvc+mybatis+spring 整合 SSM

    A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技 ...

  9. selenium自动化过程中遇到的小问题(未完待续)

    1.chrome浏览器调用不起来 代码没出错的情况下,检查下chrome浏览器的版本与chromedriver.exe的版本是否匹配;下面的表格是根据网上及官网整理的chromedriver与chro ...

  10. Python快捷键

    IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列. ALT+P  上一个历史输入内容. ALT+N 下一个历史输入内容. IDLE中按F5可以运行代码.