Chapter 21_5 替换
gsub函数的第三个参数不仅是一个字符串,还可以是一个函数或table。
如果是函数,gsub会在每次找到匹配时调用该函数。调用时的参数是捕获到的内容,该函数的返回值作为要替换的字符串。
如果是table,gsub会用每次捕获到的内容作为key,在table中进行查找。并将对应的value作为要替换的字符串。如果table不包含这个key,gsub不改变这个匹配。
示例:将完成一次变量展开,它对字符串中所有格式为$varname的部分,替换为对应全局变量varname的值:
function expand(s)
return(string.gsub(s,"$(%w+)",_G) --_G是一个全局的table变量
end
name = "Lua";status = "great"
print(expand("$name is $status , isn't it ?"))
--> Lua is great , isn't it ?
对每处与"$(%w+)"相匹配的地方,gsub都会在_G中查找捕获到的名称,并用找到的名称替换字符串中的匹配部分。如果没有找到,不进行替换
print(expand("$othername is $status , isn't it ?"))
--> $othername is great , isn't it ?
如果不确定所有的变量都有一个对应的字符串值,则可以对它们的值用tostring。在这种情况下,可以用一个函数来提供要替换的值:
function expand(s)
return (string.gsub(s,"$(%w+)",function(n)
return tostring(_G[n])
end))
end
print(expand("print = $print;a = $a"))
--> print = function: 0x8064750;a=nil
最后一个示例回到之前的格式转换器。本例仍然是将LaTeX风格的命令(\example{text})转换成XML风格(<example>text</example>),但是允许嵌套的命令。
function toxml(s)
s = string.gsub(s,"\\(%a+)(%b{})",function(tag,body)
body = string.sub(body,,-) --删除花括号,即返回从第二个到 倒数第二个字符的子串。
body = toxml(body) --处理嵌套的命令
return string.format("<%s>%s</%s>",tag,body,tag)
end )
return s
end print(toxml("\\title{The \\bold{big} example}"))
--> <title>The <bold>big</bold> example</title>
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》 和 Lua参考手册
Chapter 21_5 替换的更多相关文章
- Chapter 21_5.2 tab扩展
在Lua中,像这样()的空白捕获具有特殊意义.表示捕获它在目标字符串中的位置,返回一个数字: print(string.match("hello","()ll()&quo ...
- Chapter 21_5.1 URL编码
URL编码是http所使用的一种编码方式,用于在一个URL中传送各种参数.该编码方式会将特殊字符("=","&","+")编码为&q ...
- vim中替换命令
在VIM中进行文本替换: 1. 替换当前行中的内容: :s/from/to/ (s即substitude) :s/from/to/ : 将当前行中的 ...
- Effective C++ 之 Item 2:尽量以 const, enum, inline 替换 #define
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 2. 尽量以 const, enum, inline 替换 #d ...
- vim替换指令备忘
1. 替换当前行中的内容: :s/from/to/ (s即substitude) :s/from/to/ : 将当前行中的第一个from,替换成to.如果当前行含有多个 ...
- WITCH CHAPTER 0 [cry] 绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌
西川善司的[WITCH CHAPTER 0 cry]讲座 ~绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌 注:日文原文地址: http://pc.watch.impress.co.jp/d ...
- vi/vim 键盘图 & 替换
在VIM中进行文本替换: 1. 替换当前行中的内容: :s/from/to/ (s即substitude) :s/from/to/ : 将当前行中的第一个f ...
- Chapter 3: Connector(连接器)
一.概述 Tomcat或者称之为Catalina(开发名称),可以简化为两个主要的模块,如下图: 多个Connector关联一个Container.之所以需要多个Connector,是为了处理多种协议 ...
- EFFECTIVE OBJECTIVE-C 2.0 TIPS 总结 CHAPTER 1 & CHAPTER 2
下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更 ...
随机推荐
- Parameter Binding in ASP.NET Web API(参数绑定)
Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...
- WinForm媒体播放器
媒体播放控件(Windows Media Player )的常用属性和方法,并且利用它设计一个简单的媒体应用程序——媒体播放器.该媒体播放器可以播放 wav.avi.mid 和 mp3 等格式的文件. ...
- JavaScript修改Canvas图片
用JavaScript修改Canvas图片的分辨率(DPI) 应用场景: 仓库每次发货需要打印标签, Canvas根据从数据库读取的产品信息可以生成标签JPG, 但是这个JPG图片的默认分辨率(D ...
- [转]OPENSOLARIS 2009.06 REPOSITORY ISO IMAGES NOW AVAILABLE
Source: http://hosam.wordpress.com/2009/07/25/opensolaris-2009-06-repository-iso-images-now-availabl ...
- [原]OS X 10.9 Mavericks - Virtual Serial Port Issues
If want to do iOS kernel debugging on A4 device, first you should install Virtual COM port (VCP) dri ...
- 企业架构研究总结(45)——企业架构与建模之使用ArchiMate进行分析(全系列完)
4. 使用ArchiMate进行分析 正如前面所说的那样,一个企业整体效率的提升有时并不是通过某一个领域内的优化就能达到的,而且这种忽视全局的做法往往还会造成不必要的浪费.由此可见,一个能够跨越各个领 ...
- generating permunation
generating permunation——全排列(算法汇总) #include <iostream> #include <string> #include <vec ...
- C#制作高仿360安全卫士窗体3
C#制作高仿360安全卫士窗体(三) 距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作 ...
- Redis系统学习 四、超越数据结构
5种数据结构组成了Redis的基础,其他没有关联特定数据结构的命令也有很多.我们已经看过一些这样的命令:info,select,flushdb,multi,exec,discard,watch,和ke ...
- 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择
目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择 ASP.NET Web API能够根据请求激活目标HttpController ...