在Lua中,像这样()的空白捕获具有特殊意义。表示捕获它在目标字符串中的位置,返回一个数字:

print(string.match("hello","()ll()"))  --> 3  5  --第一个()捕获当前字符串位置,第二个()是在匹配后捕获的位置

这个示例与string.find得到的结果不一样,就因为第二个捕获的位置是在匹配之后的。

在一个字符串中扩展tab(制表符):

function expandTabs(s, tab)
tab = tab or -- tab的大小(默认是8)
local corr =
s = string.gsub(s,"()\t",function(p) --匹配字符串中所有的"\t",捕获它的位置。函数计算还需要多少空格才能达到整数倍tab的列。
local sp = tab - (p - + corr)%tab --先对位置减一,使其从0开始计数,然后加上corr以补偿前面的tab(每个tab的扩展都会影响后面的tab位置
corr = corr - + sp --更新这个corr补偿值,用于下一个tab的修正,减一以去掉当前tab,再加上要添加的空格数sp。
return string.rep(" ",sp)
end)
return s
end

再看一下如何实现逆向操作,将空格转换为tab。

第一个方法:通过空捕获来对位置进行操作

第二个方法:可以在字符串中每8个字节后插入一个标记,无论该标记是否位于空格前,都用tab替换它:

function unexpandTabs(s,tab)
tab = tab or
s = expandTabs(s) --首先对字符串中所有的tab进行了扩展
local pat = string.rep(".",tab)
s = string.gsub(s,pat,"%0\1") --在每tab个字符后添加一个标记(控制字符"\1"),"%0"是捕获整个匹配项。
s = string.gsub(s," +\1","\t") --将所有以标记结尾的空格序列(" +"都替换为tab," +"表示至少一个空格。
s = string.gsub(s,"\1","") --删除剩下的标记,即那些没有位于空格后的标记
return s
end

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

Chapter 21_5.2 tab扩展的更多相关文章

  1. asp.net ajax控件tab扩展,极品啊,秒杀其它插件

    说明:asp.net ajax控件tab要设置width和height,而且在线文本编辑器放能够放入tab中,也必须是asp.net的控件型在线文本,例如fckeditor,下面是我设置好的配置. & ...

  2. Chapter 21_5.1 URL编码

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

  3. Chapter 21_5 替换

    gsub函数的第三个参数不仅是一个字符串,还可以是一个函数或table. 如果是函数,gsub会在每次找到匹配时调用该函数.调用时的参数是捕获到的内容,该函数的返回值作为要替换的字符串. 如果是tab ...

  4. Vim 的 tab 设置

    文章转自:http://blog.csdn.net/shell_picker/article/details/6033023 摘自 Vim 手册: 选项:1. tabstop:表示一个 tab 显示出 ...

  5. Nuget 命令 NuGet 管理项目库

    因为可视化库程序包管理器的局限性,有很多需要的功能在界面中无法完成. 以下技巧均需要在"程序包管理器控制台"中使用命令来完成. 一.改变项目目标框架后,更新程序包 当改变项目的目标 ...

  6. vim格式化代码实际上就是 "缩进代码", 命令是等号=

    vim格式化代码实际上就是 "缩进代码", 命令是等号= 格式化就是 vim 根据 文件的类型, 自动的对代码进行 缩进 缩进的类型有多种, 都是用等号命令: = 全部格式化 : ...

  7. NUGet的诞生与使用

    本文引用地址:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力 ...

  8. Chrome 消息传递机制

    Chrome插件开发入门(二)——消息传递机制 Blog | Qiushi Chen 2014-03-31 9538 阅读 Chrome 插件 由于插件的js运行环境有区别,所以消息传递机制是一个重要 ...

  9. http://www.zhihu.com/question/24896283

    http://www.zhihu.com/question/24896283 Rix Tox,太不專業了 三百.知乎用户.raintorr 等人赞同 1. 更改变量名的几种方法这种情况下该如何快速选中 ...

随机推荐

  1. bootstrap悬浮顶部或者底部

    这是bootstrap提供的样式,只需要引入bootstrap.css即可. 需要使用的class样式: navbar navbar-inverse navbar-inner navbar-fixed ...

  2. 浅谈PHP在各系统平台下的换行符

    <?php echo 'aaa\n';//用于linux.unix平台C的换行也是如此 echo 'bbb\r';//用于mac平台 echo 'ccc\r\n';//用于windows平台 / ...

  3. 历年noip复赛试题整合

    早晨打算把历年的试题都过一遍,整理一下大概会往哪个方向考,考什么,不说太多,开始吧 2013: Day1: T1 转圈游戏 : 快速幂(关键在于要会打 快速幂) 思路:因为每次都进m位,相当于每次x加 ...

  4. [转]iOS Anti-Debugging Protections

    source-1: http://www.coredump.gr/articles/ios-anti-debugging-protections-part-1/ source-2: http://ww ...

  5. JavaScript数据类型检测详解

    //JS该如何检测数据的类型呢? //使用关键字: typeof //输出结果依次为:'number','string','boolean'. console.log(typeof 17); cons ...

  6. 随便讲讲XSS攻击

    作为一个前端工程师,XSS漏洞不应该只是安全部门的工作.在项目上马的时候就应该对可能涉及的安全问题有所预防才是有一个好前端.- -   什么是XSS •跨站脚本攻击(Cross-site script ...

  7. C# BackgroundWorker详解,图例,原理分析

    先声明,大部分资料均参考网上,进行了整理. 1. 在 VS 中添加了 BackgroundWorker 组件, 该组件在多线程编程方面使用起来非常 方便,然而在开始时由于没有搞清楚它的使用机制, 走了 ...

  8. 读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF)

    读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF) 这次介绍的这个框架只适用于中小项目,并且各个读写数据库结构是一致的情况,还要并且是写入数据库只有1台情况. 我们来看看这个子系 ...

  9. asp.net中的路由系统

    ASP.NET MVC重写了ASP.NET管道HttpModule和处理程序HttpHandler.MVC自定义了MvcHandler实现了Controller的激活和Action的执行.但是在请求到 ...

  10. linux下编译运行驱动

    linux下编译运行驱动 嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发. 按照如下方 ...