Lpeg与模式匹配
去年年底,开发第一版logwatch的时候,就有关注到Lpeg这个项目。
调研期间看了mozilla的heka项目,在解析日志时引入了lua的sandbox,
其定义的解析函数主要依赖Lpeg来实现,(LPEG可以称为PEG的Lua实现)。
PEG相关知识自行google–>解析表达文法。
日志领域的Lpeg
为什么mozilla的heka要引入lua和lpeg呢?
heka是基于go开发的高性能日志处理工具,lua也是以性能著称的,
而且增加或者修改lua文件并不需要重新编译,非常理想的插件模式。
对于一般的日志文件解析来说正则就足够强大了,但这个世界并不完美,
总有一些特殊情况,导致了复杂度。假如日志文件里存在一种以上的格式,
如何高效的进行解析?如何解析抽取UserAgent这样的字段?
模式匹配是一个很不错的选择,lua领域的lpeg就可以完成这个工作。
几年前我在看一个解析UserAgent的java库,大概实现思路是要跑N条正则,
看看哪个可以完成解析,这样的效率显然是很低。
初识Lpeg
Lpeg的入门还是有一些难度的,语法比较怪异,相关的例子也不是很多。
我在git上建了一个项目,记录了我练习的一些例子,从最简单的计算器、
到一个日期格式自动识别转化的工具、再到一个简易的模板(支持变量替
换和for循环语句)。【lpeg-test】。
如果你想用lpeg来自制一门脚本语言parser的话,还是要借助一些高级库,