ngx_lua_API 指令详解(二)ngx.re.match/find/gmatch/sub/gsub指令集合
1、先来个官方的ngx.re.match
location /ngx_re_match {
default_type text/html;
content_by_lua_block {
local m, err = ngx.re.match("/live/4001493201083.m3u8", "[0-9]+")
if m then
-- m[0] == "4001493201083"
ngx.say("makcj::",m[])
else
if err then
ngx.log(ngx.ERR, "error: ", err)
return
end
ngx.say("match not found")
end
}
}
分享:以上可以匹配nginx的uri里面的变量很方便。
2、ngx.re.match 指令
语法: captures,err = ngx.re.match(subject,regex,options?ctx?res_table?)
上下文: init_worker_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 *,ngx.timer。*,balancer_by_lua *,ssl_certificate_by_lua *,ssl_session_fetch_by_lua *,ssl_session_store_by_lua *
subject使用regex可选的Perl兼容正则表达式匹配字符串options。
只有匹配的第一次出现被返回,或者nil如果没有匹配。在出现错误的情况下,如看到错误的正则表达式或超过PCRE堆栈限制,nil并返回描述错误的字符串。
当发现匹配时,captures返回一个Lua表,其中captures[0]保持整个子串匹配,并captures[1]保存第一个括号子模式的捕获,captures[2]第二个等等。
#demo1
local m, err = ngx.re.match("Tinywan, 1234", "([0-9])[0-9]+")
ngx.say("match_value m[0]:",m[])
ngx.say("match_value m[1]:",m[])
输出:
match_value m[]:
match_value m[]:
说明:很简单的,不必解释
#demo2
local m, err = ngx.re.match("hello, 1234", "([0-9])(?<remaining>[0-9]+)")
ngx.say("match_value m[0]:",m[])
ngx.say("match_value m[1]:",m[])
ngx.say("match_value m[2]:",m[])
ngx.say("match_value m['remaining']:",m["remaining"])
输出
match_value m[]:
match_value m[]:
match_value m[]:
match_value m['remaining']:
说明:命名捕获,并在与编号捕获的键值对相同的Lua表中返回
3、ngx.re.find
语法: from,to,err = ngx.re.find(subject,regex,options?ctx?,nth?)
上下文: init_worker_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 *,ngx.timer。*,balancer_by_lua *,ssl_certificate_by_lua *,ssl_session_fetch_by_lua *,ssl_session_store_by_lua *
该方法与ngx.re.match方法基本类似,不同的地方在于ngx.re.find返回的是匹配的字串的起始位置索引和结束位置索引,如果没有匹配成功,那么将会返回两个nil,如果匹配出错,还会返回错误信息到err中。
#demo1
local s = "hello Tinywan, 123456"
local from, to, err = ngx.re.find(s, "([0-9]+)", "jo")
if from then
ngx.say("from: ", from)
ngx.say("to: ", to)
ngx.say("matched: ", string.sub(s, from, to))
else
if err then
ngx.say("error: ", err)
return
end
ngx.say("not matched!")
end
输出:
from:
to:
matched:
说明:字符串s的长度为21个字节,from:表示匹配成功的索引开始位置,to:则为结束位置,而配置的字符串长度为:to-from+1
!!!官方推荐理由:因为这个API函数不会创建新的Lua字符串或新的Lua表,它比ngx.re.match快得多。应尽可能使用。
自0.9.3发布以来,支持可选的第五个参数,nth以指定要返回哪个(子匹配)捕获的索引。当nth为0(默认为)时,返回整个匹配子字符串的索引; 何时nth为1,则返回第一个配对捕获的索引; 当nth为2时,则返回第二次匹配捕获,依此类推。当指定的子配对不匹配时,nil将返回两个值
local str = "hello Openresty, 1234878787"
local from, to = ngx.re.find(str, "([0-9])([0-9]+)", "jo", nil, )
if from then
ngx.say("matched 2nd submatch: ", string.sub(str, from, to))
end
输出:matched 2nd submatch: 234878787
4、ngx.re.gmatch
语法: iterator,err = ngx.re.gmatch(subject,regex,options?)
上下文: init_worker_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 *,ngx.timer。*,balancer_by_lua *,ssl_certificate_by_lua *,ssl_session_fetch_by_lua *,ssl_session_store_by_lua *
与ngx.re.match类似,但是返回一个Lua迭代器,以便让用户程序员<subject>使用PCRE 对string参数的所有匹配进行迭代regex。如果出现错误,就像看到形式不正常的正则表达式,nil并且将返回描述错误的字符串
#demo1
local iterator, err = ngx.re.gmatch("hello, world!", "([a-z]+)", "i")
if not iterator then
ngx.log(ngx.ERR, "error: ", err)
return
end
local m
m, err = iterator() -- m[0] == m[1] == "hello"
ngx.say(" 1 m[0] == ",m[]," m[1] == ",m[])
if err then
ngx.log(ngx.ERR, "error: ", err)
return
end
m, err = iterator() -- m[0] == m[1] == "world"
ngx.say(" 2 m[0] == ",m[]," m[1] == ",m[])
if err then
ngx.log(ngx.ERR, "error: ", err)
return
end
m, err = iterator() -- m == nil
if err then
ngx.log(ngx.ERR, "error: ", err)
return
end
输出:
m[] == hello m[] == hello
m[] == world m[] == world
#demo2
local it, err = ngx.re.gmatch("hello, world!", "([a-z]+)", "i")
if not it then
ngx.log(ngx.ERR, "error: ", err)
return
end
while true do
local m, err = it()
if err then
ngx.log(ngx.ERR, "error: ", err)
return
end
if not m then
-- no match found (any more)
break
end
-- found a match
ngx.say(m[])
ngx.say(m[])
end
输出:
hello
hello
world
world
可选options参数与ngx.re.match方法完全相同的语义。
当前的实现需要仅在单个请求中使用返回的迭代器。也就是说,不应该将它分配给属于持久命名空间的变量,如Lua包。
该方法需要在Nginx中启用PCRE库。
5、ngx.re.sub
语法: newstr,n,err = ngx.re.sub(subject,regex,replace,options?)
上下文: init_worker_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 *,ngx.timer。*,balancer_by_lua *,ssl_certificate_by_lua *,ssl_session_fetch_by_lua *,ssl_session_store_by_lua *
将带有字符串或函数参数regex的subject参数字符串的Perl兼容正则表达式的第一个匹配替换replace。可选options参数与ngx.re.match具有完全相同的含义。
此方法返回所生成的新字符串以及成功替换的数量。在出现故障的情况下,如正则表达式或<replace>字符串参数中的语法错误,它将返回nil一个描述该错误的字符串。
当replace是字符串时,它被视为用于字符串替换的特殊模板
#demo1
local newstr, n, err = ngx.re.sub("hello, 1234", "([0-9])[0-9]", "[$0][$1]")
if newstr then
-- newstr == "hello, [12][1]34"
-- n == 1
ngx.say("newstr == ",newstr)
else
ngx.log(ngx.ERR, "error: ", err)
return
end
输出:
newstr == hello, [][]
n ==
说明:其中$0引用由模式匹配的整个子字符串,并$1引用第一个括号化的捕获子字符串
6、ngx.re.gsub
语法: newstr,n,err = ngx.re.gsub(subject,regex,replace,options?)
上下文: init_worker_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 *,ngx.timer。*,balancer_by_lua *,ssl_certificate_by_lua *,ssl_session_fetch_by_lua *,ssl_session_store_by_lua *
就像ngx.re.sub一样,但是全局替换
#demo1
local newstr, n, err = ngx.re.gsub("hello, world", "([a-z])[a-z]+", "[$0,$1]", "i")
if newstr then
ngx.say("newstr == ",newstr)
ngx.say("n == ",n)
else
ngx.log(ngx.ERR, "error: ", err)
return
输出:
newstr == [hello,h], [world,w]
n ==
说明:该方法需要在Nginx中启用PCRE库
#demo2
local func = function (m)
return "[" .. m[] .. "," .. m[] .. "]"
end
local newstr, n, err = ngx.re.gsub("hello, world", "([a-z])[a-z]+", func, "i")
ngx.say("newstr == ",newstr)
ngx.say("n == ",n)
输出:
newstr == [hello,h], [world,w]
n ==
ngx_lua_API 指令详解(二)ngx.re.match/find/gmatch/sub/gsub指令集合的更多相关文章
- [转]JVM指令详解(上)
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码 助记符 ...
- rsync指令详解
rsync指令详解(更详细的看官方文档http://rsync.samba.org/ftp/rsync/rsync.html) [root@Centos epel]# rsync --help rsy ...
- 迈向angularjs2系列(2):angular2指令详解
一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOC ...
- Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解
前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY <源路径> .. ...
- PopUpWindow使用详解(二)——进阶及答疑
相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...
- GCC 指令详解及动态库、静态库的使用
GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...
- C#中的预处理器指令详解
这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...
- .NET DLL 保护措施详解(二)关于性能的测试
先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...
- #pragma 预处理指令详解
源地址:http://blog.csdn.net/jx_kingwei/article/details/367312 #pragma 预处理指令详解 在所有的预处理指令中, ...
随机推荐
- laraver框架学习
最近开始学习laravel框架,这个框架在国外很流行,近些年开始在国内流行.自己而是刚开始学习这个框架. 使用composer 更新系统内的依赖包 在终端输入:composer update Entr ...
- jira webhook 事件触发并程序代码调用jenkins接口触发构建操作
要解决的问题 开发管理工具触发站点构建事件,事件处理中需要调用Jenkins接口开始构建动作. 我的应用场景: 使用jira作为管理工具,在jira中创建自定义的工作流来规定测试,上线,发布等流程,并 ...
- jenkins pipeline 部署
一.git 版本控制结合jenkins 发布 sh-4.2$ git branch sh-4.2$ git chekout master sh-4.2$ git tag v1.1 sh-4.2$ gi ...
- 使用顽灯浏览器执行H5游戏辅助挂机
前一篇<使用Fidder从安卓模拟器获取APP内H5游戏网址>我们获取到了APP内H5游戏的网址,那么接下来我们使用辅助工具做一些日常任务,如:每天晚上20点做副本,定时喊话,自动清理包裹 ...
- saltstack-----master迁移篇
打包/etc/salt/下的pki文件夹.发送到新的master,然后更改minion的hosts,重启minion,最后重启新master..搞定(salt "*" servic ...
- 做游戏的小伙伴们注意了,DDoS还可以这样破!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 作者:腾讯DDoS安全专家.腾讯云游戏安全专家haroldchen 摘要:在游戏出海的过程中,DDoS攻 ...
- SQL手工注入漏洞测试(Sql Server数据库)
还是先找到注入点,然后order by找出字段数:4 通过SQL语句中and 1=2 union select 1,2,3……,n联合查询,判断显示的是哪些字段,就是原本显示标题和内容时候的查询字段. ...
- HAOI2017 新型城市化 二分图的最大独立集+最大流+强连通缩点
题目链接(洛谷):https://www.luogu.org/problemnew/show/P3731 题意概述:给出一张二分图,询问删掉哪些边之后可以使这张二分图的最大独立集变大.N<=10 ...
- C++ 实验 使用重载运算符实现一个复数类
实验目的: 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法 实验要求: 1.定义一个复数类,描述一些必须的成员函数,如:构造函数,析构函数,赋值函数,返回数据成员值的函数等. ...
- ElasticSearch 2 (37) - 信息聚合系列之内存与延时
ElasticSearch 2 (37) - 信息聚合系列之内存与延时 摘要 控制内存使用与延时 版本 elasticsearch版本: elasticsearch-2.x 内容 Fielddata ...