lua正则式

由于工作的原因,写了几天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

使用场景与举例

提取匹配目标

例如,你没有用第三方的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-\" ☞ 这里的圆括号先忽略,匹配零个或多个任意字符,直到出现空格,匹配零个或者多个空格直到出现双引号 " 
现在可以描述这里圆括号的作用了。圆括号中的内容是会被传递到回调函数中作为参数的。即会被提取返回。
细细体会这个例子,剩下的就能够看文档看明白了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值