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

对于具有捕获的模式,函数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. Linq无聊练习系列6--Any/All/Contains/Concat/Union/Intersect/Except/take/skip/SqlMethods操作练习

    /*********************Any/All/Contains/Concat/Union/Intersect/Except/take/skip/SqlMethods操作练习******* ...

  2. 用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(上)

    一.本程序的起源 当我决定去中科院实习的时候,我给刘奎恩老师发了封邮件.我对此事是非常看重的,因此经常使用浏览器,打开gmail去查看刘老师有没有给我回复.因为gmail的新邮件推送的功能仅限于打开浏 ...

  3. rcp(插件开发) 如何查找自己定义的扩展点

    规则: 扩展点所在的插件ID(X)+扩展点的name(Y) 也就是 X.Y 具体代码 Platform.getExtensionRegistry().getExtensionPoint(X.Y).ge ...

  4. Using CrunchBase API

    Let us have fun with CrunchBase API. What can CrunchBase API give us? They said: https://developer.c ...

  5. Arduino 各种模块篇 motor shield

    根据arduino官方网站出的shield, 类似的情况有很多中motor shield 这里测试采用的是http://www.seeedstudio.com/wiki/Motor_Shield_V1 ...

  6. 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题

    如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 在android中有时候可能要实现一个底部弹 ...

  7. centos6.5 搭建nginx1.6.0 +gridfs +mongodb2.4..10环境

    一) 缘由 因为公司业务需要,需要搭建图片服务器,需求很简单:读取+上传图片,当时第一考虑用nginx来作,但考虑到单纯用nginx来作,无法水平扩展和管理,一旦遇到海量图片,就无办法 扩展.所以考虑 ...

  8. PHP之语言基础01 By ACReaper

    1.PHP中的变量是不需要声明类型的,由$标识变量,变量的命名规则也是字母或者下划线开头,接着任意字符或者下划线. $PI = 3.14; $radius = 5; $cir = $PI * 2 * ...

  9. Android 点击桌面快捷方式和Notifycation跳转到Task栈顶Activity

    我们一般下载的应用在第一次启动应用的时候都会给我创建一个桌面快捷方式,然后我在网上找了些资料整理下了,写了一个快捷方式的工具类,这样我们以后要创建快捷方式的时候直接拷贝这个类,里面提供了一些静态方法, ...

  10. transaction manager has disabled its support for remote/network transactions. 该伙伴事务管理器已经禁止了它对远程/网络事务

    最近再用SSIS做数据归档,里面用到了分布式事务.在开发阶段是在一台计算机上运行只要是启动分布式服务就没什么问题,可是昨天把它部署到uat的时候遇到问题,错误信息是: 最后找到解决方案: 确认&quo ...