openresty ngx_lua正则表达式
ngx.re.match
ngx.re.match:返回第一个匹配的结果
语法格式:value, err = ngx.re.match(subject, pattern, options?, ctx?, nth?)
* 如果有匹配结果,返回第一个匹配的结果
* 如果没有匹配的结果,value=nil
* 如果出现异常,value=nil,err为异常信息
# options可选值
i:忽略大小写
o:仅编译一次
m:多行模式
j:启用pcre jit编译,nginx需带参数(--enable-jit),常与参数o一起使用
# ctx:指定开始查找的位置,位置下标从1开始计数
* local ctx = {pos = 10},从位置10开始查找
# nth:将索引为nth的表数据返回,默认为0
* ngx.re.match(subject, pattern)返回value,
* ngx.re.match(subject, pattern, "oj", nil, 1) <==> value[1]
环境:init_worker_by_lua*、ngx.timer*、balancer_by_lua*
set_by_lua*、rewrite_by_lua*、access_by_lua*、content_by_lua*
header_filter_by_lua*、body_filter_by_lua*、log_by_lua*
ssl_certificate_by_lua*、ssl_session_fetch_by_lua、ssl_session_store_by_lua
示例
location / {
content_by_lua_block {
local m, err = ngx.re.match(ngx.var.uri, "([0-9]+)(aaa)");
if m then
ngx.say(ngx.var.uri, " 匹配成功,返回的结果类型 ==> ", type(m));
ngx.say(ngx.var.uri, " m[0] ==> ", m[0]); #m[0]返回第一个匹配的全部数据
ngx.say(ngx.var.uri, " m[1] ==> ", m[1]); #m[1]数据中第1个括号中的数据
ngx.say(ngx.var.uri, " m[2] ==> ", m[2]); #m[2]数据中第2个括号中的数据
ngx.say(ngx.var.uri, " m[3] ==> ", m[3]); #m[3]数据中第3个括号中的数据,没有则为nil
else
if err then
ngx.say(ngx.var.uri, "匹配出错:", err);
end
ngx.say(ngx.var.uri, "没查到匹配结果");
end
}
}
curl localhost:80/123aaa/234aaa,结果输出:
/123aaa/234aaa 匹配成功,返回的结果类型 ==> table
/123aaa/234aaa m[0] ==> 123aaa
/123aaa/234aaa m[1] ==> 123
/123aaa/234aaa m[2] ==> aaa
/123aaa/234aaa m[3] ==> nil
ngx.re.gmatch
ngx.re.gmatch:返回迭代器,可遍历输出全部匹配数据
语法格式:value, err = ngx.re.match(subject, pa