基础函数比较简单,就是几个普通的函数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. myeclipse maven编译出错

    从.net 到java  快一年了.这一年学了很多东西.从开发角度来说俩个语言查不到.部署上差异较大.不过java处理问题上确实不太统一.好多问题在网上没有正确的回答.刚换台式机发现 mvn inst ...

  2. Python Tutorial - Parse JSON Objects with Python

    This tutorial is copied from youtube.com Here is the link: http://www.youtube.com/watch?v=RXqo3lC-JP ...

  3. asp.net通用查询模块设计

    asp.net通用查询模块设计 前言 自从上次狂喷了devexpress for asp.net面向互联网的app的各种不合理,好像骂的dev无处容身了,不过说实话,dev在做互联网的app时,生成的 ...

  4. 推荐一个很好用的HTTP操作类

    /// <summary> /// 类说明:HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提示 ...

  5. IOS设计模式学习(6)生成器

    1 前言 有时候,构建某些对象有多种不同方式.如果这些逻辑包含在构建这些对象的类中的单一方法中,构建的逻辑会非常荒唐(例如,针对各种构建需求的一大片嵌套if-else或者switch-case语句). ...

  6. data矩阵poj 2778 DNA Sequence

    最近研究data矩阵,稍微总结一下,以后继续补充: ac自动机处理字符串,dp计算谜底,用矩阵来减速     每日一道理 巴尔扎克说过“不幸,是天才的进升阶梯,信徒的洗礼之水,弱者的无底深渊”.风雨过 ...

  7. Spring事务的传播行为 @Transactional(转)

    Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...

  8. 分享下mac安装xamarin跨平台开发环境的坑

    之前在vs2015上安装好了xamarin环境,考虑到调试IOS仍然需要mac机,昨天决定直接在mac上安装xamarin. 安装完所有的效果如上图,此时已经可以创建安卓和IOS环境. 我安装过程中, ...

  9. C语言之break和continue

    一 break 和 continue 的介绍 break: 1).跳出当前所在的switch语句(tips:可查看前面 switch 部分)   2).跳出当前所在的循环 continue: 结束本次 ...

  10. C语言之算数运算符

    一 什么是算数运算符 算术运算符: +:  就是把两个数据相加,得到和 -:  就是把两个数据相减,得到差 *:  就是把两个数据相乘,得到积 /:  就是把两个数据相除,得到商 %:  就是把两个数 ...