在openresty项目中,更推荐使用ngx.re模块中正则匹配方法,理由如下:
Lua 中正则表达式的性能并不如 ngx.re中的正则表达式好。Lua 中的正则表达式与 Nginx 中的正则表达式相比,有 5%-15% 的性能损失,而且 Lua 将表达式编译成 Pattern 之后,并不会将 Pattern 缓存,而是每此使用都重新编译一遍,潜在地降低了性能。ngx.re中的正则表达式可以通过参数缓存编译过后的 Pattern,不会有类似的性能损失。
Lua 中的正则表达式并不符合 POSIX 规范,而ngx.re中实现的是标准的 POSIX 规范,更具备通用性。
1. 常用方法
captures, err = ngx.re.match(subject, regex, options?, ctx?, res_table?)
功能:返回第一个匹配结果,匹配不到返回nil
返回:captures(table类型),captures[0]存储(整个模板)匹配出的完整子字符串,其他从1开始的元素存储regex指定的捕获。
from, to, err = ngx.re.find(subject, regex, options?, ctx?, nth?)
功能:仅返回匹配到的第一个串的开始和结束位置(下标),lua中从1开始
返回:from,to分别为开始位置和结束位置
注:当只需要判断是否能匹配到时推荐使用find而不是match方法,因为该方法不会产生新的lua tables,速度更快。
2. 用法
建议使用这些方法时最少带上选项‘jo’
o:仅编译一次,启用worker级别的缓存
j:启用JIT编译
例如下面这样:
local m, err = ngx.re.match("hello, 1234", "([0-9])[0-9]+")
-- m[0] == "1234"
-- m[1] == "1"
3. 正则转义
在*_by_lua_block中使用:
1) 需要\\\\d表示\d,因为ngxin.conf会将\\\\d解析成\\d,再在lua中解析成\d
2) 使用[[...]],在[[...]]里可以直接被lua用,像这样[[\\d]]
在*_by_lua_file中使用:
1) \\d被lua解析一次为\d
2) 用[[...]],直接使用[[\d]]
其他转义字符同理