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 数据类 ...
随机推荐
- 在winform中怎样实现好看的treeview样式
这是在网上截取的一张图,就是想做成这样的效果,不能用devExperss控件,主要是不知道他的那个“组织机构列表“用的是不是panel,怎样弄的样式
- Linux 宿主机安装 MiniGUI
去MiniGUI官方网站看的时候,很兴奋,安装竟然这么容易. 上帝总是在给你一个苹果之后,赏你一巴掌.我的确是高兴太早了. 首先看一下官网文档的说明步骤: (截取于官方文档) Installing r ...
- 模板方法(Template)模式
模板方法(Template)模式 前言 前段时间在亚马逊买了一本<CLR>的书,当时搞活动买一送一,然后挑了一本<漫谈设计模式>,一位不相识的大牛写的,这几天闲来无事,翻了几页 ...
- Binder机制,从Java到C (8. ServiceManager in Native)
在第三篇 Binder机制,从Java到C (3. ServiceManager in Java) 中,讲到ServiceManager的Stub端在Native,Proxy端在Java.实际上,还要 ...
- UIWebView的探索
UIWebView 说到iOS的UIWebView,应该会很快回忆起常用委托方法,异步loadRequest.stopLoading.reload方法等. 在此我总结一些容易忽略的属性和方法: 1. ...
- 对于vijos11.2模拟赛
特意起了个傻逼标题,只是想提醒一下自己以后不要犯逗(所以应该没有什么神犇点进来吧?) T1,T3 当场写的时候就觉得是不可写的,看了题解之后还是觉得不可写,人弱没办法.到了这个时候也懒得管这么难的东西 ...
- github上写个人简历
随笔- 70 文章- 0 评论- 567 在github上写个人简历——先弄个主页 起因 不知道园友们在使用智联招聘等网站填写简历的时候对要求输入的内容有没有一种无力感,不吐槽了反正就一句话 ...
- JavaScript function函数种类介绍
JavaScript function函数种类介绍 本篇主要介绍普通函数.匿名函数.闭包函数 1.普通函数介绍 1.1 示例 ? 1 2 3 function ShowName(name) { ...
- Ubuntu12.04安装配置Theano
上次写了一个关于DL的开篇内容,本来说是要继续跟进的,后来教研室里面出了一些事情,加上写论文.和隔壁教研室做实验,就一直拖到现在.早就让小K配置环境研究研究Theano,这货和我一样也发拖延症了,理由 ...
- 转:运行yum报错Error: Cannot retrieve metalink for reposit
http://www.netpc.com.cn/593.html 运行yum报错Error: Cannot retrieve metalink for repository: epel. Please ...