Chapter 21_4 捕获
捕获功能在很多地方都在使用,就是从目标字符串中抽出匹配于该模式的内容,在指定捕获时,应将模式中需要捕获的部分写到一对圆括号内。
对于具有捕获的模式,函数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 捕获的更多相关文章
- [转]第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV
仅供参考,还未运行程序,理解部分有误,请参考英文原版. 绿色部分非文章内容,是个人理解. 转载请注明:http://blog.csdn.net/raby_gyl/article/details/174 ...
- 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, ...
- TIJ——Chapter One:Introduction to Objects
///:~容我对这个系列美其名曰"读书笔记",其实shi在练习英文哈:-) Introduction to Objects Object-oriented programming( ...
- Java编程思想总结笔记The first chapter
总觉得书中太啰嗦,看完总结后方便日后回忆,本想偷懒网上找别人的总结,无奈找不到好的,只好自食其力,尽量总结得最好. 第一章 对象导论 看到对象导论觉得这本书 目录: 1.1 抽象过程1.2 每个对象 ...
- C++异常处理解析: 异常的引发(throw), 捕获(try catch)、异常安全
前言: C++的异常处理机制是用于将运行时错误检测和错误处理功能分离的一 种机制(符合高内聚低耦合的软件工程设计要求), 这里主要总结一下C++异常处理的基础知识, 包括基本的如何引发异常(使用th ...
- Linux 中的网络数据包捕获
Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...
- javascript中的事件冒泡和事件捕获
1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...
- WPF 捕获键盘输入事件
最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...
- .NET 基础 一步步 一幕幕[数组、集合、异常捕获]
数组.集合.异常捕获 数组: 一次性存储多个相同类型的变量. 一维数组: 语法: 数组类型[] 数组名=new 数组类型[数组长度]; 声明数组的语法: A.数据类型 [] 数组名称= new 数据类 ...
随机推荐
- Web API中使用Dependency Resolver
Web API中使用Dependency Resolver 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyo ...
- 生活沉思录 via 哲理小故事(四)
1.围墙里的墓碑 第一次世界大战期间,驻守意大利某小镇的年轻军官结识了镇上的牧师.虽然军官信仰信教,而牧师是天主教牧师,但两人一见如故. 军官在一次执行任务中身负重伤,弥留之际嘱托牧师无论如何要把自己 ...
- hdu 2159
二维背包,dp[i][j]表示忍耐度为i,且还可以杀j个怪时能获得的最大经验值 dp[i][j]=max(dp[i][j],dp[i-r[k]][j-1]+e[k]),r[k]为杀死第k种怪掉的忍耐度 ...
- UITableView的style详解
在默认的UITableViewCell中,主要有三个系统控件,分别是两个Lable和一个imageView,两个Label,imageView(始终在最左边)的布局位置可以通过下面4个设置: UITa ...
- 新版C#编译器关于函数闭包
新版C#编译器关于函数闭包的一处更改 在Visual Basic.NET中,如果你写下类似下面的代码: Public Sub Test() For i = 0 To 100 Dim func = ...
- wget ( download the whole page from the website )
---恢复内容开始--- wget -m -e robots=off -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1 ...
- linux netstat 命令详解
linux netstat 命令详解 1.功能与说明 netstat 用于显示linux中各种网络相关信息.如网络链接 路由表 接口状态链接 多播成员等等. 2.参数含义介绍 -a (all)显示所 ...
- Kendo UI开发教程(7): Kendo UI 模板概述
Kendo UI 框架提供了一个易用,高性能的JavaScript模板引擎.通过模板可以创建一个HTML片段然后可以和JavaScript数据合并成最终的HTML元素. Kendo 模板侧重于UI显示 ...
- iOS GCD中级篇 - dispatch_group
1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件. 最常见的几个方法: 1.dispatch_group_create创建一个调度任务组 2 ...
- spring mvc下shiro的session,request等问题
最近的一个项目使用的是spring mvc,权限框架使用的是shiro. 不过有一个问题一直困扰着我,现在的session到底是谁的session,是servlet的还是shiro的. 于是我把spr ...