由于工作的原因,写了几天lua。没有培训,没有翻书。扫了一下官方文档,开工。
我统计了一下我写的lua代码,多的时候有1100行。可能用高级方式五百行代码即可。删减了一些垃圾代码,换用了一些高级手段。代码量压缩到了八百多行。
sh/lua/python最近的项目都有用,Python的语法有些操蛋,过于松散则是过于紧缩,而且没有符号来限制和生命作用域,全依赖对齐真悲剧。一条语句,至少有几十种不同的写法。对于习惯了写C和C++的人来说,简直就是大灾难。我现在知道为什么Python的性能这么渣渣了,就是用性能给这么垃圾的语法埋单了。shell则有很多细节需要注意的。例如if条件里面的内容要一个空格隔开。【这点导致的bug真操蛋】
lua稍微好一点。很接近C语言。lua给我的印象很好。轻巧简洁。
lua的正则式很精悍。当然,易用性方面和静态语言比较还是有差距的。
我整理了一些关于lua正则式的资料,加了一些demo给各位。资料也大多是来自网络和官方文档。不过没有找到原出处,所以未指明引用的资料来源。见谅!
关键字
lua的正则式保留的关键字如下( ) . % + - * ? [ ^ $
'%' 用作特殊字符的转义字符
'%.' 匹配点;
'%%' 匹配字符 '%'。
值得注意的是,这里没有
\
/
转译和表达
%s 空白符
%p 标点字符
%c 控制字符
%d 数字
%x 十六进制数字
%z 代表0的字符
%a 字母
%l 小写字母
%u 大写字母
%w 字母和数字
上面字符类的大写形式表示小写所代表的集合的补集。例如,%A 非字母的字符。%S 表示非空字符
模式修饰符
+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次;最长匹配 -- 先尽可能长地把本次匹配模式走完,再继续下一个模式,
- 匹配前一字符0次或多次;最短匹配 -- 本次匹配模式每走一步,就考查下一个模式能否进入.
? 匹配前一字符0次或1次
^ 匹配字符串开头
$ 匹配字符串结尾
转义字符 '%' 不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。
用 [] 创建字符集
[%w_] 匹配字母数字和下划线
[01] 匹配二进制数字
[%[%]] 匹配一对方括号
在[]中使用连字符'-'
%d 表示 '[0-9]';
%x 表示 '[0-9a-fA-F]'
[0-7] 表示 '[01234567]'
在 [] 开始处使用 ^ 表示其补集:
[^0-7] 匹配任何不是八进制数字的字符;
[^\n] 匹配任何非换行符户的字符。
[^%s] == %S
使用场景与举例
提取匹配目标
{
"system": {
"release_date": "2015-04-25",
"md5sum": "dddddddddddddddddddddddddddddddd",
"path": "system",
"filename": "abc.tar"
},
"file": {
"uploadtime": "1999-12-29",
"md5sum": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"path": "updates",
"filename": "efg.pdf"
}
}
system中 的path字段
function parsejson( str , separator )
local val
string.gsub(str,separator,function(c)val=c end)
return val
end
local path = parsejson(rawjs,".-system.-path.-:%s-\"(.-)%s-\"")
这里说明一下正则式中的内容的由来
. ☞ 任意字符