Chapter 21_5.2 tab扩展
在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扩展的更多相关文章
- asp.net ajax控件tab扩展,极品啊,秒杀其它插件
说明:asp.net ajax控件tab要设置width和height,而且在线文本编辑器放能够放入tab中,也必须是asp.net的控件型在线文本,例如fckeditor,下面是我设置好的配置. & ...
- Chapter 21_5.1 URL编码
URL编码是http所使用的一种编码方式,用于在一个URL中传送各种参数.该编码方式会将特殊字符("=","&","+")编码为&q ...
- Chapter 21_5 替换
gsub函数的第三个参数不仅是一个字符串,还可以是一个函数或table. 如果是函数,gsub会在每次找到匹配时调用该函数.调用时的参数是捕获到的内容,该函数的返回值作为要替换的字符串. 如果是tab ...
- Vim 的 tab 设置
文章转自:http://blog.csdn.net/shell_picker/article/details/6033023 摘自 Vim 手册: 选项:1. tabstop:表示一个 tab 显示出 ...
- Nuget 命令 NuGet 管理项目库
因为可视化库程序包管理器的局限性,有很多需要的功能在界面中无法完成. 以下技巧均需要在"程序包管理器控制台"中使用命令来完成. 一.改变项目目标框架后,更新程序包 当改变项目的目标 ...
- vim格式化代码实际上就是 "缩进代码", 命令是等号=
vim格式化代码实际上就是 "缩进代码", 命令是等号= 格式化就是 vim 根据 文件的类型, 自动的对代码进行 缩进 缩进的类型有多种, 都是用等号命令: = 全部格式化 : ...
- NUGet的诞生与使用
本文引用地址:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力 ...
- Chrome 消息传递机制
Chrome插件开发入门(二)——消息传递机制 Blog | Qiushi Chen 2014-03-31 9538 阅读 Chrome 插件 由于插件的js运行环境有区别,所以消息传递机制是一个重要 ...
- http://www.zhihu.com/question/24896283
http://www.zhihu.com/question/24896283 Rix Tox,太不專業了 三百.知乎用户.raintorr 等人赞同 1. 更改变量名的几种方法这种情况下该如何快速选中 ...
随机推荐
- Ubuntu下LaTex中文环境安装与配置
转载自:http://www.linuxidc.com/Linux/2012-06/62456.htm LaTeX是一个强大的排版软件,但是其最初只是为英文排版而设计的.为了使其能够胜任中文排版的重任 ...
- ASP.NET MVC 中的视图生成
关于 ASP.NET MVC 中的视图生成 在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Mode ...
- Step one : 熟悉Unix/Linux Shell 常见命令行 (四)
4.了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息 了解/etc目录下的各种配置文章 /etc/hosts 主机配置文件 /etc/netwo ...
- 5 MySQL索引
目录: 1. 索引概述 1.1 为什么引入索引 1.2 什么是索引 1.3 索引的好处 1.4 索引的不足 1.5 索引分类 2. 索引设计原则 3. 索引建立和删除 3.1 索引创建 3.2 索引删 ...
- .NET:线程本地存储、调用上下文、逻辑调用上下文
.NET:线程本地存储.调用上下文.逻辑调用上下文 目录 背景线程本地存储调用上下文逻辑调用上下文备注 背景返回目录 在多线程环境,如果需要将实例的生命周期控制在某个操作的执行期间,该如何设计?经典的 ...
- C/C++基础知识总结——函数
1. 随机函数的使用 1.1 头文件: # include <cstdlib> 或 # include <stdlib.h> 1.2 用法 srand(int seed);// ...
- SharePoint开发
做SharePoint开发有时候是一件比较痛苦的事情,毕竟庞大的框架总是笨重的~~ 往往如果采取传统的方式开发SharePoint的话,更改一个代码需要有以下操作: 1)更改代码 2)VS编译——&g ...
- 读写ini文件
C# 使用文件流来读写ini文件 背景 之前采用ini文件作为程序的配置文件,觉得这种结构简单明了,配置起来也挺方便.然后操作方式是通过WindowsAPI,然后再网上找到一个基于WindowsAPI ...
- 如何避免误用分布式事务(System.Transactions.TransactionScope)
以下内容来源与:http://www.cyqdata.com/cyq1162/article-detail-54453 1:本地事务DbTransaction和分布式事务TransactionScop ...
- FAQ:仓储实现为什么在基础设施层?
FAQ:仓储实现为什么在基础设施层? 目录 问答部分参考文章 问答部分返回目录 问: 仓储实现为什么在基础设施层? 答: 领域模型包含三种元素:实体.值对象和服务,这三种元素都可以以某种形式使用仓储, ...