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. 更改变量名的几种方法这种情况下该如何快速选中 ...
随机推荐
- [置顶] 网页提交方式post和get的区别和联系
都知道GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.但具体区别呢?可以互换吗? 主要区别有:1传输数据的方式不同,2传输的数据多少不同,3传输数据的安全性不同4,后台获取数据的方式 ...
- poj3006 筛选法求素数模板(数论)
POJ:3006 很显然这是一题有关于素数的题目. 注意数据的范围,爆搜超时无误. 这里要用到筛选法求素数. 筛选法求素数的大概思路是: 如果a这个数是一个质数,则n*a不是质数. 用一个数组实现就是 ...
- Definition of:payload
(1) Refers to the "actual data" in a packet or file minus all headers attached for transpo ...
- 如何去除AJAX收到数据中包含的html页面数据
问题: 如下代码所示,我用AJAX收到来自url: 'kzkj_check.jsp',返回的数据msg,总是包含页面的html数据,可是我只想要我返回的数据“false”, $.ajax({ url: ...
- 关于Jquery 序列化表单的注意事项
在JQuery 的serialize方法序列化表单的过程中,如果表单的name值最后有空格,会出现“+”号,查源码可见原因.这一小问题就浪费了半小时的时间,记录下来,备忘.
- 对象池化技术 org.apache.commons.pool
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...
- No object in the CompoundRoot has a publicly accessible property named
No object in the CompoundRoot has a publicly accessible property named 'typeid' (no setter could be ...
- Hadoop Streaming框架学习2
Hadoop Streaming框架学习(二) 1.常用Streaming命令介绍 使用下面的命令运行Streaming MapReduce程序: 1: $HADOOP_HOME/bin/hadoop ...
- ToList<>()所带来的性能影响
ToList<>()所带来的性能影响 前几天优化师弟写的代码,有一个地方给我留下很深刻的印象,就是我发现他总是将PLINQ的结果ToList<>(),然后再返回给主程序,对于 ...
- 实战 ASP.NET MVC Web API
实战 ASP.NET MVC Web API Web API 框架基于 ASP.NET MVC 框架开发,是一个面向 Http 协议的通信框架.相对于 WCF 而言,Web API 只面向于 Http ...