正则表达式
在 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 来修改。 # nginx.conf location /test { content_by_lua ' local regex = [[d+]] -- 参数"o"是开启缓存必须的 local m = ngx.re.match("hello,1234",regex,"o") if m then ngx.say(m[0]) else ngx.say("not matched!") end '; } # 在网址中输入"yourURL/test",即会在网页中显示 1234 。 Lua 中正则表达式语法上最大的区别,Lua 使用'%' 来进行转义,而其他语言的正则表达式使用'' 符号来进行转义。其次,Lua 中并不使用'?' 来表示非贪婪匹配,而是定义了不同的字符来表示是否是贪婪匹配。定义如下:
Lua 正则简单汇总
local s = "hello world" local i,j = string.find(s,"hello") print(i,j) --> 1 5
local s = "hello world from Lua" for w in string.gmatch(s,"%a+") do print(w) end -- output : -- hello -- world -- from -- Lua
local a = "Lua is cute" local b = string.gsub(a,"cute","great") print(a) --> Lua is cute print(b) --> Lua is great
--> a line print(string.gsub("a (enclosed (in) parentheses) line","%b()","")) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |