捕获功能在很多地方都在使用,就是从目标字符串中抽出匹配于该模式的内容,在指定捕获时,应将模式中需要捕获的部分写到一对圆括号内。

对于具有捕获的模式,函数match会将所有捕获到的值作为单独的结果返回。即它会将目标字符串切成多个捕获到的部分:

pair = "name = Anna"
key,value = string.match(pair,"(%a+)%s*=%s*(%a+)")
print(key,value) --> name Anna

%a+模式表示一个非空的字母序列,"%s*"表示一个可能为空的空格序列。

上例模式中的两个字母序列的内容分别放在括号中,下面是一个类似的例子:

date = "today is 26/9/2016"
d,m,y = string.match(date,"(%d+)/(%d+)/(%d+)")
print(d,m,y) -->26 9 2016

  在模式中,可以对模式本身使用捕获,像%d,这里的d是一个只有一位的数字,表示只匹配与第d个捕获相同的内容。

假设在一个字符串中寻找一个由单引号或双引号括起来的子串。那么可以:

'["'].-["']'

但是在遇到"it's all right"这样的字符串就有问题了,所以上面的%d模式就有用武之地了:

s = [[then he said:"it's all right"!]]
q,quotePart = string.match(s,"([\"'])(.-)%1") --第一个括号表示捕获引号字符本身,第二个括号表示捕获引号中的内容,即与".-"相匹配的子串。
print(q) --> "
print(quotePart) --> it's all right

又如,匹配Lua中的长字符串:

%[(=*)%[(.-)%]%%]

它匹配的内容依次是:一个左方括号、0或多个"="、另一个方括号、任意内容(字符串的内容)、一个右方括号、相同数量的等号及另一个右方括号:

p = "%[(=*)%[(.-)%]%1%]"
s = "a = [=[[[ something ]] ]==] ]=];print(a)"
print(string.match(s,p)) --> = [[ something ]] ]==]

第一个捕获是等号序列,本例的等号序列中只有一个等号。

第二个捕获是字符串的内容。

对于捕获到的值,还可用于gsub函数的字符串替换。和模式一样,用于替换的字符串中也可以包含"%d"这样的项。当进行替换时,这些项就对应于捕获到的内容。

"%0"表示整个匹配,并且替换字符串中的"%"必须被转移为"%%"。下面这个示例会重复字符串中的每个字符,并且在每个副本之间插入一个减号:

print(string.gsub("hello Lua!","%a","%0-%0")) --%a表示匹配字母,将h替换为h-h
-->h-he-el-ll-lo-o L-Lu-ua-a! 8

下例交换了所有相邻的字符:

print(string.gsub(hello Lua","(.)(.)","%%"))
-->ehll ouLa

  一个更有用的示例,格式转换器,它能读取用LaTeX风格书写的命令字符串,例如:

\command{some text}

并将它转换为XML风格的格式:

<command>some text</command>

不处理嵌套的命令,用下面的代码可以完成该工作:

s = [[the \quote{task} is to \em{change} that.]]
s = string.gsub(s,"\\(%a+){(.-)}","<%1>%2</%1>")
print(s)
--> the <quote>task</quote> is to <em>change</em> that.

最后一个示例,如何剔除字符串两端空格的示例:

function trim(s)
return (string.gsub(s,"^%s*(.-)%s*$","%1")) --用括号是强制丢弃多余的结果,只保留一个结果。
end

"^%s*" 表示匹配前端的所有空格。

"%s*$" 表示匹配后端的所有空格。

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》 和 Lua参考手册

Chapter 21_4 捕获的更多相关文章

  1. [转]第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV

    仅供参考,还未运行程序,理解部分有误,请参考英文原版. 绿色部分非文章内容,是个人理解. 转载请注明:http://blog.csdn.net/raby_gyl/article/details/174 ...

  2. 8.HBase In Action 第一章-HBase简介(1.2.2 捕获增量数据)

    Data often trickles in and is added to an existing data store for further usage, such as analytics, ...

  3. TIJ——Chapter One:Introduction to Objects

    ///:~容我对这个系列美其名曰"读书笔记",其实shi在练习英文哈:-) Introduction to Objects Object-oriented programming( ...

  4. Java编程思想总结笔记The first chapter

    总觉得书中太啰嗦,看完总结后方便日后回忆,本想偷懒网上找别人的总结,无奈找不到好的,只好自食其力,尽量总结得最好. 第一章  对象导论 看到对象导论觉得这本书 目录: 1.1 抽象过程1.2 每个对象 ...

  5. C++异常处理解析: 异常的引发(throw), 捕获(try catch)、异常安全

    前言: C++的异常处理机制是用于将运行时错误检测和错误处理功能分离的一 种机制(符合高内聚低耦合的软件工程设计要求),  这里主要总结一下C++异常处理的基础知识, 包括基本的如何引发异常(使用th ...

  6. Linux 中的网络数据包捕获

    Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...

  7. javascript中的事件冒泡和事件捕获

    1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...

  8. WPF 捕获键盘输入事件

    最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...

  9. .NET 基础 一步步 一幕幕[数组、集合、异常捕获]

    数组.集合.异常捕获 数组: 一次性存储多个相同类型的变量. 一维数组: 语法: 数组类型[] 数组名=new 数组类型[数组长度]; 声明数组的语法: A.数据类型 [] 数组名称= new 数据类 ...

随机推荐

  1. FormsAuthentication登录ReturnUrl使用绝对路径

    ASP.NET]更简单的方法:FormsAuthentication登录ReturnUrl使用绝对路径   被这个问题困扰多年,今天终于找到了更简单的解决方法,分享一下. 问题场景 假设我们在i.cn ...

  2. Identity

    ThreadStatic应用(Identity补完)   关于Identity Identity自增序列/唯一断标识 起初做这个东西,是在一个内部组件中,用于在高并发的环境下得到一个较短的“相对”不重 ...

  3. ASP.NET MVC相关

    Orchard源码分析(7):ASP.NET MVC相关 概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供 ...

  4. [置顶] 学习JDK源码:可进一步优化的代码

    1.参数化类型的构造函数比较啰嗦 new HashMap<String, List<String>>() 如果你调用参数化类的构造函数,那么很不幸,你必须要指定类型参数,即便上 ...

  5. TaskTracker获取并执行map或reduce任务的过程1

    TaskTracker获取并执行map或reduce任务的过程(一) 我们知道TaskTracker在默认情况下,每个3秒就行JobTracker发送一个心跳包,也就是在这个心跳包中包含对任务的请求. ...

  6. Windows 安装Mongoliadb

    1. 下载 下载地址: http://www.mongodb.org/downloads 我这里用的是:mongodb-win32-x86_64-2008plus-2.4.5.zip 2. 设置目录 ...

  7. PHP之算法

    PHP之算法偶遇隨感 要求如下:    第1种: A,B,C    期望能够得到的组合是: AB,AC,BC        第2种: A,B,C,D(可通过参数控制结果长度,如长度为2或3)    期 ...

  8. ORM查询语言(OQL)简介高级篇

    ORM查询语言(OQL)简介--高级篇:脱胎换骨 在写本文之前,一直在想文章的标题应怎么取.在写了<ORM查询语言(OQL)简介--概念篇>.<ORM查询语言(OQL)简介--实例篇 ...

  9. jquery跨域请求数据

    jquery跨域请求数据 jquery跨越请求数据.实际开发中经常会碰到两个网站数据交互问题,当向另一个站点请求数据该如何做? 实际上非常容易,请按照下面的步骤做: 第一:编写js,通过get获取远程 ...

  10. 典型的团队VS优秀团队

    如果做不了优秀的团队,那么就做一个典型的团队,公司需要这么一个神话,需要这么一个领头羊. 我在进入某公司后,第一个项目用的是"敏捷开发方法".而公司的理念恰恰是:开发.协作性强.扁 ...