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指令集合的更多相关文章

  1. [转]JVM指令详解(上)

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符      ...

  2. rsync指令详解

    rsync指令详解(更详细的看官方文档http://rsync.samba.org/ftp/rsync/rsync.html) [root@Centos epel]# rsync --help rsy ...

  3. 迈向angularjs2系列(2):angular2指令详解

    一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOC ...

  4. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  5. PopUpWindow使用详解(二)——进阶及答疑

      相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  6. GCC 指令详解及动态库、静态库的使用

    GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...

  7. C#中的预处理器指令详解

    这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...

  8. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

  9. #pragma 预处理指令详解

    源地址:http://blog.csdn.net/jx_kingwei/article/details/367312 #pragma  预处理指令详解              在所有的预处理指令中, ...

随机推荐

  1. ReactJS实用技巧(1):JSX与HTML的那些不同

    在项目中使用ReactJS也已经有大半年了,收获很多也踩过不少坑.不想把这个系列写成抄书似的罗列,旨在总结些常用的技巧及常见的坑,以帮助初心者快速入门,想系统学习的同学还是多阅读文档. JSX本质上与 ...

  2. WEB返回顶部效果

    1. PC端页面返回顶部效果 1 $( window ).scroll(function(){ 2 if( $( window ).scrollTop() > 500 ){ // 当顶部的滚动距 ...

  3. Jq_SetTimeOut

    倒计时 59 秒: var t function timedCount() { document.getElementById('txt').value=c ){ c--; }else{ clearT ...

  4. Windows Server 2003出现Directory Listing Denied This Virtual Directory does not allow contents to be listed.的解决方案

    Directory Listing DeniedThis Virtual Directory does not allow contents to be listed. 是目录权限无法访问的问题 解决 ...

  5. Unity5.6之前版本VRTK插件基础交互

    一.VR运行环境配置: 安装steam,在steam上安装SteamVR驱动. 在Unity项目中需要导入VRTool插件包(已上传服务器),里面包含两个插件一个是SteamVR插件,一个是VRTK插 ...

  6. Leetcode题库——47.全排列II

    @author: ZZQ @software: PyCharm @file: permuteUnique.py @time: 2018/11/16 13:34 要求:给定一个可包含重复数字的序列,返回 ...

  7. “数学口袋精灵”第二个Sprint计划(第四天)

    “数学口袋精灵”第二个Sprint计划----第四天进度 任务分配: 冯美欣:欢迎界面的背景音乐完善 吴舒婷:游戏界面的动作条,选择答案后的音效 林欢雯:代码算法设计 进度:   冯美欣:欢迎界面背景 ...

  8. Log4Net使用指南之用log4net记录日志到数据库(含有自定义属性)------附Demo例子源代码

    Log4NET简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 前提 最近做项目 ...

  9. 清华大学OS操作系统实验lab1练习知识点汇总

    lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...

  10. mysql 清空数据

    清空数据有2 个命令 -- 清空全部数据,不写日志,不可恢复,速度极快 truncate table 表名; -- 清空全部数据,写日志,数据可恢复,速度慢 delete from 表名 业务需求:清 ...