前言
在 OpenResty 中,同时存在两套正则表达式规范:Lua 语言的规范和 Nginx 的规范;即使您对 Lua 语言中的规范非常熟悉,仍不建议使用 Lua 中的正则表达式。
- 因为 Lua 中正则表达式的性能并不如 Nginx 中的正则表达式优秀;
- Lua 中的正则表达式并不符合 POSIX 规范,而 Nginx 中实现的是标准的 POSIX 规范,后者明显更具备通用性。
Lua 中的正则表达式与 Nginx 中的正则表达式相比,有 5%-15%的性能损失,而且 Lua 将表达式编译成 Pattern 之后,并不会将 Pattern 缓存,而是每此使用都重新编译一遍,潜在地降低了性能。Nginx 中的正则表达式可以通过参数缓存编译过后的 Pattern ,不会有类似的性能损失。
o 选项参数用于提高性能,指明该参数之后,被编译的 Pattern 将会在 worker 进程中缓存,并且被当前 worker 进程的每次请求所共享。 Pattern 缓存的上限值通过 lua_regex_cache_max_entries 来修改。
1.1 Openresty正则
1.1.1 ngx.re.match
语法: captures, err = ngx.re.match(subject, regex, options?, ctx?, res_table?)
只有第一次匹配的结果被返回,如果没有匹配,则返回nil;或者匹配过程中出现错误时,也会返回nil,此时错误信息会被保存在err中。
当匹配的字符串找到时,一个Lua table captures会被返回,captures[0]中保存的就是匹配到的字串,captures[1]保存的是用括号括起来的第一个子模式的结果,captures[2]保存的是第二个子模式的结果,依次类似。
参数:options
a | 锚定模式,只从头开始匹配. |
d | DFA模式,或者称最长字符串匹配语义,需要PCRE 6.0+支持. |
D | 允许重复的命名的子模式,该选项需要PCRE 8.12+支持,例如 local m = ngx.re.match(“hello, world”, “(?<named>\w+), (?<named>\w+)”, “D”) — m[“named”] == {“hello”, “world”} |
i | 大小写不敏感模式. |
j | 启用PCRE JIT编译, 需要PCRE 8.21+ 支持,并且必须在编译时加上选项–enable-jit,为了达到最佳性能,该选项总是应该和’o’选项搭配使用. |
J | 启用PCRE Javascript的兼容模式,需要PCRE 8.12+ 支持. |
m |