ngx.re模块和lua正则匹配的区别
山海-Oo
2020年03月10日 03:58
收录于文集
共1篇

选择

在openresty项目中,更推荐使用ngx.re模块中正则匹配方法,理由如下:

  1.  Lua 中正则表达式的性能并不如 ngx.re中的正则表达式好。Lua 中的正则表达式与 Nginx 中的正则表达式相比,有 5%-15% 的性能损失,而且 Lua 将表达式编译成 Pattern 之后,并不会将 Pattern 缓存,而是每此使用都重新编译一遍,潜在地降低了性能。ngx.re中的正则表达式可以通过参数缓存编译过后的 Pattern,不会有类似的性能损失。

  2. Lua 中的正则表达式并不符合 POSIX 规范,而ngx.re中实现的是标准的 POSIX 规范,更具备通用性。

nginx.re模块

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&#​34;, "([0-9])[0-9]+&#​34;)

 -- m[0] == "1234&#​34;

 -- m[1] == "1&#​34;


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]]

其他转义字符同理