由于工作的原因,写了几天lua。没有培训,没有翻书。扫了一下官方文档,开工。

我统计了一下我写的lua代码,多的时候有1100行。可能用高级方式五百行代码即可。删减了一些垃圾代码,换用了一些高级手段。代码量压缩到了八百多行。

sh/lua/python最近的项目都有用,Python的语法有些操蛋,过于松散则是过于紧缩,而且没有符号来限制和生命作用域,全依赖对齐真悲剧。一条语句,至少有几十种不同的写法。对于习惯了写C和C++的人来说,简直就是大灾难。我现在知道为什么Python的性能这么渣渣了,就是用性能给这么垃圾的语法埋单了。shell则有很多细节需要注意的。例如if条件里面的内容要一个空格隔开。

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

使用场景与举例

提取匹配目标

例如,你没有用第三方的json.lua这类blabla的lua库,也不想调用C/C++等其他语言。想解析json中的某一个字段。即提取目标。这时候需要用到


( )


在圆括号中写匹配目标。


例如如下json解析


{
    "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-\"")

这里说明一下正则式中的内容的由来


".-system.-path.-:%s-\"(.-)%s-\""
 
 . ☞ 任意字符 
-  ☞ 匹配前一规则0次或多次。最短匹配, 每次匹配完都检验下一个匹配规则是否满足( * 是最长匹配)
 
system ☞ 匹配system字符。.-system 的含义是匹配若干任意字符,直到system字符,则匹配system字符。此处用来匹配system前面的 空格 { "
 
.-path ☞ 匹配零个或者多个任意字符,直到出现path字符。
 
.-: ☞ 匹配零个或多个任意字符,直到出现冒号 : 
 
%s-\" ☞ 匹配零个或者多个空格,直到出现双引号 "
 
(.-)%s-\"


现在可以描述这里圆括号的作用了。圆括号中的内容是会被传递到回调函数中作为参数的。即会被提取返回。


细细体会这个例子,剩下的就能够看文档看明白了。