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 替换的更多相关文章

  1. Chapter 21_5.2 tab扩展

    在Lua中,像这样()的空白捕获具有特殊意义.表示捕获它在目标字符串中的位置,返回一个数字: print(string.match("hello","()ll()&quo ...

  2. Chapter 21_5.1 URL编码

    URL编码是http所使用的一种编码方式,用于在一个URL中传送各种参数.该编码方式会将特殊字符("=","&","+")编码为&q ...

  3. vim中替换命令

    在VIM中进行文本替换:       1.  替换当前行中的内容:    :s/from/to/    (s即substitude)         :s/from/to/     :  将当前行中的 ...

  4. Effective C++ 之 Item 2:尽量以 const, enum, inline 替换 #define

    Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 2. 尽量以 const, enum, inline 替换 #d ...

  5. vim替换指令备忘

    1.  替换当前行中的内容: :s/from/to/    (s即substitude) :s/from/to/     :  将当前行中的第一个from,替换成to.如果当前行含有多个        ...

  6. WITCH CHAPTER 0 [cry] 绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌

    西川善司的[WITCH CHAPTER 0  cry]讲座 ~绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌   注:日文原文地址: http://pc.watch.impress.co.jp/d ...

  7. vi/vim 键盘图 & 替换

    在VIM中进行文本替换:    1.  替换当前行中的内容:    :s/from/to/    (s即substitude)        :s/from/to/     :  将当前行中的第一个f ...

  8. Chapter 3: Connector(连接器)

    一.概述 Tomcat或者称之为Catalina(开发名称),可以简化为两个主要的模块,如下图: 多个Connector关联一个Container.之所以需要多个Connector,是为了处理多种协议 ...

  9. EFFECTIVE OBJECTIVE-C 2.0 TIPS 总结 CHAPTER 1 & CHAPTER 2

    下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更 ...

随机推荐

  1. 依赖注入和IOC

    http://www.bbsmvc.com/archiver/csharp/thread-831-1.html 本来想使用一下Ninject的,然后搜索了很久,都没找到比较详细的关于Ninject的使 ...

  2. window wamp下xhprof的安装使用,Graphviz配置

    在新的工作安排下来前赶紧把手上工作优化下,本来是靠xdebug+grindview来的,不过还是麻烦,就换上这个轻量级的性能测试了.网上搜的大多都是lamp环境下的,wamp下的倒是不多,而且不好用, ...

  3. npm ERR! Error: socket hang up

    when i use npm to install express, it goes this message: npm info it worked if it ends with ok npm i ...

  4. MVC test

    1,index @{ ViewBag.Title = "Index"; } <!DOCTYPE html> <html> <head> < ...

  5. 讲讲Linq to SQL映射(基础篇)

    讲讲Linq to SQL映射(基础篇) 这篇主要讲Linq to  SQL基于属性的映射.即映射数据库,映射表,映射列,映射关系,映射存储过程, 映射函数.然而创建这种映射有三种方法,他们分别是OR ...

  6. WCF心跳判断服务端及客户端是否掉线并实现重连接

    WCF心跳判断服务端及客户端是否掉线并实现重连接 本篇文章将通过一个实例实现对WCF中针对服务端以及客户端是否掉线进行判断:若掉线时服务器或客户端又在线时将实现自动重连:将通过WCF的双工知识以及相应 ...

  7. Show 一下最新的动态属性扩展功能与键值生成器功能

    Show 一下最新的动态属性扩展功能与键值生成器功能 YbSoftwareFactory 各种插件的基础类库中又新增了两个方便易用的功能:动态属性扩展与键值生成器,本章将分别介绍这两个非常方便的组件. ...

  8. 设计模式——(Abstract Factory)抽象工厂

    设计模式——(Abstract Factory)抽象工厂 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难.你必须设计相关类,并设计类的接口和继承之间的关系.设计必须可以解决当前问题,同 ...

  9. 探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别

    探讨C++ 变量生命周期.栈分配方式.类内存布局.Debug和Release程序的区别(一) 今天看博客园的文章,发现博问栏目中有一个网友的问题挺有趣的,就点进去看了下,标题是“C++生存期问题”,给 ...

  10. struts征程:1.初识struts2

    1.struts2在开发中所必须用到的jar包导入到项目的lib目录下 2.在web.xml中配置一个过滤器,代码格式如下 <filter> <filter-name>stru ...