• API工具类(一)玩转正则表达式等常用SDK


      玩转正则表达式等常用API

    在 OpenResty 中使用正则

    ①  正则

    1. 1、openresty存在'两套'正则表达式规范
    2. 1) lua自身'独有'的正则规范
    3. 备注:大约有'5%~15%'性能损耗
    4. 损耗原因:表达式'compile'成pattern,并不会被缓存,每次都会被重新'compile'编译
    5. 2) nginx的符合'POSIX'规范'的PCRE'正则规范 --> 推荐并'强制'使用

    ngx.re模块和lua正则匹配的区别

    ②  ngx.re API的来源

    lua-resty-core 提供ngx.re.split      lua-nginx-module提供ngx.re API

    1. 涉及: 'match、find、sub、gsub、gmatch''split、opt'函数
    2. match: '单次'正则匹配,同时也会'捕获'子表达式
    3. gmatch:多次正则匹配 --> 以'迭代器'的方式
    4. find: 同match,但返回的是'查找'到的位置索引
    5. sub: '单次'正则替换
    6. gsub: 全局'global'正则替换
    7. split: 正则'分割'
    8. 关注点: 函数的'参数''作用域'

    ③  ngx.re.match

    1. 语法: captures, err = ngx.re.match(subject, regex, options?, ctx?, res_table?)
    2. 关注: '入参含义''可选项''返回值'
    3. 补充: 参数subject和regex是'必须'的,而后三个options、ctx、res_table都可以'省略'
    4. captures[n]是匹配的'子表达式';如果未找到匹配或者出错,那么captures就是nil,err 是错误信息
    5. 附加: captures '说明'
    6. 1) captures 是'table'类型
    7. 2) captures[0]存储匹配出的'完整'子字符串
    8. 3) 其他'从1开始'的元素存储regex指定的'捕获'
    9. 常用: regex 'pattern''变量'代替

    1. 1、基本'解读'
    2. 1) 如果'有匹配'结果,返回'第一个'匹配的结果
    3. 2) 如果'没有匹配'的结果,value=nil
    4. 3) 如果出现'异常',value=nil,err为'异常'信息

    说明: 以下'四个'官方案例,不使用'options'''

    2、regex 'pattern解读' --> 'PCRE'正则

    nginx中使用的PCRE正则 

    1. 3、可选'options'参数解读
    2. 推荐: "oj" 参数 --> "双引号"
    3. x: 允许在'模式中'加入任何数量的'空白'

    补充: 'o'选项的解读

    说明: 'u'选项的'案例'

    4、可选'ctx'参数解读

    1. 5、可选'res_table'参数解读 --> "了解"
    2. 解读: 存储'所有匹配'的结果,相当于'返回值captures',有利于'重用内存'

    res_table案例

    ④  ngx.re.find

    1: 上下文  --> '思考:常用在哪个阶段?'

    1. 2: synax '语法'
    2. 关注点: 可选入参 'nth?'、返回值 'from、to、err'
    3. 备注: 其它'入参解读'参见 'ngx.re.match'函数讲解

    1. 3: 基本'解读'
    2. 1) 如果'有匹配'结果,start、end表示'第一个匹配''起、始'索引位置
    3. 细节点: 好好体回'第一个匹配'的含义
    4. 2) 如果'没有'匹配的结果,start、end=nil
    5. 3) 如果出现'异常',start、end=nil,err为'异常'描述信息
    6. 备注: 返回值根据'不同'的匹配结果,是'动态'

    1. 4、应用'场景'
    2. 场景:当只需要判断'是否能匹配到'时推荐使用'find'而不是match方法
    3. 强调:re.find '没有创建'新字符串 的'性能'好于re.match ,'软waf防火墙'一般会使用're.find'
    4. 原因:因为该方法'不会'产生'新'的lua tables,'速度'更快

    5、对可选入参'nth'的解读

    ⑤  ngx.re.gmatch

    1. 1: '基本解读'
    2. 1) 语法格式:value, err = ngx.re.match(subject, pattern, options?)
    3. 2) 返回'迭代器',可'遍历'输出'匹配'数据
    4. 3) 如果出现'异常',value=nil,err为'异常'信息

    2:案例'讲解'

    ⑥  ngx.re.sub

    1. 1:基本'解读'
    2. 1) 语法格式:newStr, n, err = ngx.re.sub(subject, pattern, replace, options?)
    3. 2) 功能:将'第一个匹配的字符串'替换为'replace',返回'替换后'的字符串'newstr'
    4. 备注: '返回 n'表示替换的'次数 (0或者1)'
    5. 附加: sub --> 'substitutes' --> '替换'

    1. 2: 案例'讲解'
    2. 案例1: 'replace''字符串'的形式
    3. 1) replace中'$0''$1''${n}'的含义
    4. 2) 只能使用'$'转义'$'获取'$'字面字符,不能使用'\'进行转义

    案例2: 'replace''function'的形式,此时'match table''replace function'的入参

    ⑦  ngx.re.gsub

    syntax: res, err = ngx_re.split(subject, regex, options?, ctx?, max?, res?)

    ⑧  ngx.re.split

    1: '导读'

    2: 基本'语法'解读

    1. 细节:
    2. 1) split是lua-resty-core 库的一部分,能够非常轻松地'切分'字符串
    3. 2) 但它'没有内置'在ngx.re表内,必须'显式加载ngx.re模块'才能使用
    4. reqire("ngx.re").split --> '显式加载'ngx.re模块,这里'不复用'
    1. 3: '案例1'讲解 --> 不同的'regex'分割形式
    2. 形式1: regex --> "(,)"
    3. 形式2: regex --> ""

    4: '案例2'讲解 --> options为'nil',ctx含有'pos'字段

    1. 5:max '可选'参数解读 --> '参数5'
    2. 场景: 在'己知'可能的字串数量的时候可以'提前'结束匹配,提高'效率'

    6:res '可选'参数解读 --> '参数6'  --> '了解即可'

    ⑨  require "ngx.re".opt

    相关参考

    ⑪  openresty的正则指令

    1: 'lua_regex_match_limit'  --> 限制'回溯'次数

    lua_regex_match_limit

    如何彻底避免正则表达式的灾难性回溯     nginx的正则回溯和灾难性回溯

    lua_regex_cache_max_entries 

    2: 'lua_regex_cache_max_entries'  --> 正则'缓存'

    ⑩  正则转义

    1. 1、在'*_by_lua_block'中使用:
    2. 1) 需要\\\\d表示\d,因为ngxin.conf会将'\\\\d'解析成\\d,再在lua中解析成\d
    3. 2) 使用[[...]],在[[...]]里可以'直接被lua用',像这样[[\\d]]
    4. 2、在'*_by_lua_file'中使用:
    5. 1) \\d被lua解析一次为\d
    6. 2) 用[[...]],直接使用'[[\d]]'
    7. 备注:其他'转义字符'同理
    8. 案例:ngx.re.match(str,[[\w+z]],'ijo') --> 忽略大小写,'编译并缓存'

    openresty编程最佳实践   令牌桶算法的限流实例   正则 [[]]案例

    OpenResty动态反向代理域名的实践    

    lua自身的正则表达式

    openresty最佳实践    注解5

    nginx'内存'泄露: gdb、nmmap、'火焰图'
  • 相关阅读:
    Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解
    详解CAN总线:CAN协议分层结构及功能
    如何在阿里云快速配置自动定时重启ECS云服务器?
    NFS共享
    css图片滚动
    【Python】tqdm 介绍与使用
    【MySQL】分析SQL的几种方式
    深度学习笔记(51) 基础知识
    java优先级队列PriorityQueue
    flask第一个应用
  • 原文地址:https://blog.csdn.net/wzj_110/article/details/132746152