基础函数比较简单,就是几个普通的函数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. 项目Splash页面的开发与设计

    项目Splash页面的开发与设计 首先建立一个安卓的项目,然后修改manifest.xml文件,修改应用程序的logo和显示名称,效果图如下: 对应的代码如下: 1 <?xml version= ...

  2. 新的IRepository接口+搜索和排序解耦(+基于Castle实现)

    新的IRepository接口+搜索和排序解耦(+基于Castle实现) 经过了上篇IRepository和IRepository<T>的讨论[文章地址为:http://www.cnblo ...

  3. 开源来自百度商业前端数据可视化团队的超漂亮动态图表--ECharts

    开源来自百度商业前端数据可视化团队的超漂亮动态图表--ECharts 本人项目中最近有需要图表的地方,偶然发现一款超级漂亮的动态图标js图表控件,分享给大家,觉得好用的就看一下.更多更漂亮的演示大家可 ...

  4. ngx-push-stream模块源码学习(四)——订阅

    一.概述 push stream模块允许三种模式的订阅者: longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略 stream:与服务端保持长连接,持续不断的请求-&g ...

  5. Caffe Ubuntu14.04 64位 的最快安装 (cuda7.5 + cudnn7.0 2016最新)

    最近因为各种原因,装过不少次Caffe,安装过程很多坑,为节省新手的时间,特此总结整个安装流程. 关于Ubuntu 版本的选择,建议用14.04这个比较稳定的版本,但是千万不要用麒麟版!!!比原版体验 ...

  6. hdu 1166 敌兵布阵(线段树基础题)

    学习线段树~~~~~~~~~~~~要好好理解 此题是单点更新的线段树,考虑基本的询问,更新. #include <iostream> #include <algorithm> ...

  7. Servlet部署描述文件(web.xml)

    最近看了下配置文件(Deployment Descriptor:简称DD),又称部署描述文件,下面详细介绍下该文件的组成和作用: 一.<web-app>有四个属性: 1.xmlns:申明了 ...

  8. head first--------------------template method pattern

    head first---------模板方法模式         浅谈谈模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...

  9. codeforces 6A. Triangle

    A. Triangle time limit per test 2 seconds memory limit per test 64 megabytes input standard input ou ...

  10. 从零开始学C++之构造函数与析构函数(一):构造函数、析构函数、赋值与初始化、explicit关键字

    一.构造函数.默认构造函数 (1).构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构 ...