Hello!
你使用的正则语法是 Javascript 正则而不是 Perl 兼容正则,即 \uXXXX 这种指定 Unicode code point
的记法是 Javascript 正则中特有的记法。
PCRE 默认是 Perl 兼容正则,所以需要特别指定 Javascript 模式,例如:
location /t {
content_by_lua '
local m = ngx.re.match("章", [[\\u7AE0]], "uJ")
if m then
ngx.say("matched: ", m[0])
else
ngx.say("not matched!")
end
';
}
注意这里的正则选项 "uJ" 中 u 是启用 UTF-8 模式,J 则是用于启用 Javascript 模式。访问此 /t 接口得到期望的输出:
matched: 章
注意 ngx.re API 中的这个 J 选项是我刚刚特意添加到 ngx_lua 的 master 分支的,补丁如下:
https://github.com/chaoslawful/lua-nginx-module/commit/07d4873
同时要确保你的 PCRE 在编译时启用了 UTF-8 支持(官方源码包默认是禁用的)。
如果你不想使用 git 仓库里面最新的 ngx_lua 版本,则可以稍微修改一下你的正则表达式,换用 Perl 正则的记法来表达
Unicode code point,即用 \x{XXXX} 来取代 \uXXXX. 特别地,你仍需要指定 "u" 正则选项以启用
UTF-8 模式。下面是一个例子:
location /t {
content_by_lua '
local m = ngx.re.match("章", [[\\x{7AE0}]], "u")
if m then
ngx.say("matched: ", m[0])
else
ngx.say("not matched!")
end
';
}
访问 /t 接口仍然可以得到期望的结果:
matched: 章
关于 PCRE 支持的正则记法的更多细节,请参考 PCRE 的官方 manpage:
http://www.pcre.org/pcre.txt
Best regards,
-agentzh