API原理概念篇(六)玩转正则表达式等常用API

news2024/11/20 20:35:11

  玩转正则表达式等常用API

①  正则

1、openresty存在'两套'正则表达式规范

 1) lua自身'独有'的正则规范   

 备注:大约有'5%~15%'性能损耗

 损耗原因:表达式'compile'成pattern,并不会被缓存,每次都会被重新'compile'编译

 2) nginx的符合'POSIX'规范'的PCRE'正则规范  --> 推荐并'强制'使用

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

②  ngx.re API的来源

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

涉及: 'match、find、sub、gsub、gmatch'、'split、opt'函数

关注点: 函数的'参数'、'作用域'

③  ngx.re.match

语法: captures, err = ngx.re.match(subject, regex, options?, ctx?, res_table?)

关注: '入参含义'、'可选项'、'返回值'

补充: 参数subject和regex是'必须'的,而后三个options、ctx、res_table都可以'省略'

captures[n]是匹配的'子表达式';如果未找到匹配或者出错,那么captures就是nil,err 是错误信息

附加: captures '说明'

  1) captures 是'table'类型

  2) captures[0]存储匹配出的'完整'子字符串

  3) 其他'从1开始'的元素存储regex指定的'捕获'

常用: regex 'pattern' 用'变量'代替

1、基本'解读'

 1) 如果'有匹配'结果,返回'第一个'匹配的结果
 
 2) 如果'没有匹配'的结果,value=nil

 3) 如果出现'异常',value=nil,err为'异常'信息

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

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

nginx中使用的PCRE正则 

3、可选'options'参数解读

推荐: "oj" 参数  --> "双引号"

x: 允许在'模式中'加入任何数量的'空白'

补充: 'o'选项的解读

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

4、可选'ctx'参数解读

5、可选'res_table'参数解读  --> "了解"

解读: 存储'所有匹配'的结果,相当于'返回值captures',有利于'重用内存'

res_table案例

④  ngx.re.find

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

2: synax '语法'

关注点: 可选入参 'nth?'、返回值 'from、to、err'

备注: 其它'入参解读'参见 'ngx.re.match'函数讲解

3: 基本'解读'

 1) 如果'有匹配'结果,start、end表示'第一个匹配'的'起、始'索引位置

 细节点: 好好体回'第一个匹配'的含义

 2) 如果'没有'匹配的结果,start、end=nil

 3) 如果出现'异常',start、end=nil,err为'异常'描述信息

备注: 返回值根据'不同'的匹配结果,是'动态'的

4、应用'场景'的强调

场景:当只需要判断'是否能匹配到'时推荐使用'find'而不是match方法

原因:因为该方法'不会'产生'新'的lua tables,'速度'更快

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

⑤  ngx.re.gmatch

1: '基本解读'

 1) 语法格式:value, err = ngx.re.match(subject, pattern, options?)
 
 2) 返回'迭代器',可'遍历'输出'匹配'数据

 3) 如果出现'异常',value=nil,err为'异常'信息

2:案例'讲解'

⑥  ngx.re.sub

1:基本'解读'

 1) 语法格式:newStr, n, err = ngx.re.sub(subject, pattern, replace, options?)

 2) 功能:将'第一个匹配的字符串'替换为'replace',返回'替换后'的字符串'newstr'

 备注: '返回 n'表示替换的'次数 (0或者1)'

 附加: sub --> 'substitutes' --> '替换'

2: 案例'讲解'

案例1: 'replace'是'字符串'的形式

 1) replace中'$0'、'$1'、'${n}'的含义

 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) split是lua-resty-core 库的一部分,能够非常轻松地'切分'字符串

  2) 但它'没有内置'在ngx.re表内,必须'显式加载ngx.re模块'才能使用

   reqire("ngx.re").split  --> '显式加载'ngx.re模块,这里'不复用'
3: '案例1'讲解 --> 不同的'regex'分割形式

 形式1: regex --> "(,)"

 形式2: regex --> ""

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

5:max '可选'参数解读 --> '参数5'

场景: 在'己知'可能的字串数量的时候可以'提前'结束匹配,提高'效率'

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

⑨  require "ngx.re".opt

相关参考

⑪  openresty的正则指令

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

lua_regex_match_limit

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

lua_regex_cache_max_entries 

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

⑩  正则转义

1、在'*_by_lua_block'中使用:

1)  需要\\\\d表示\d,因为ngxin.conf会将'\\\\d'解析成\\d,再在lua中解析成\d

2) 使用[[...]],在[[...]]里可以'直接被lua用',像这样[[\\d]]

2、在'*_by_lua_file'中使用:

1) \\d被lua解析一次为\d

2) 用[[...]],直接使用'[[\d]]'

备注:其他'转义字符'同理 

案例:ngx.re.match(str,[[\w+z]],'ijo') --> 忽略大小写,'编译并缓存'

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

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

lua自身的正则表达式

openresty最佳实践    注解5

nginx'内存'泄露: gdb、nmmap、'火焰图'等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Hadoop] start-dfs.sh ssh报错

Permission denied (publickey 决解方案 相关命令 cd ~/.sshssh-keygen -t rsa -p""cat id_rsa.pub >> authorized_keyschmod 0600 authorized_keys 相关链接Hadoop: start-dfs.sh permission denied - Stack Overflow Java HotSpot(TM) Server VM warning…

分享!JetBrains IDE中的GitLab支持

GitLab是流行的基于git的软件开发和部署平台之一,虽然很长一段时间以来,所有基本git操作都已经可以通过GitLab实现,但GitLab集成仍是JetBrains社区的一大最热门请求。为此,JetBrains团队今年与GitLab联手提供了这种类型的集成。 …

【问题记录】解决Git上传文件到GitHub时收到 “GH001: Large files detected” 错误信息!

环境 Windows 11 家庭中文版git version 2.41.0.windows.1GitHub 问题情况 在命令行中使用git上传pdf文件到GitHub服务器时,提示了如下警告信息: 原因是 GitHub 有一个文件大小限制,通常为 100 MB。 如果尝试上传大于此限制的文件&#xff0c…

EMANE中olsrd的调试

1 调试目的 本着学习的态度,对emane tutorial中的示例程序进行重现,以加深对EMANE的理解和掌握。在示例程序0(见https://github.com/adjacentlink/emane-tutorial/wiki/Demonstration-0)中介绍了使用olsrlinkview.py脚本来通过可视化界面观察olsr节点的链…

Marin说PCB之封装设计系列---(01)--非金属化孔的设计总结

提到封装设计小编我刚刚开始学习的时候也是一头雾水,在网上各种找视频学习怎么建封装。在这里小编我也推荐一波凡亿PCB商城上是有封装课程的,我当时就是买的凡亿的封装设计课程自己跟着老师学习的,效果还是挺好的。小编我免费给他们做一波推广…

集合减法【新思路】

#include<stdio.h> int main() {int n,m,flag0;int x;int a[100001]{0},b[100001]{0};scanf("%d %d",&n,&m);以集合A所有元素作为数组下标映射值成1 for (int i 0; i < n; i) {scanf("%d", &x);a[x] 1; }以集合B所有元素作为数组下…

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具

Fuxploider:一款针对文件上传漏洞的安全检测与研究工具 1.概述2. 工具使用1.概述 Fuxploider是一款功能强大的开源渗透测试工具,该工具专门针对文件上传漏洞而设计,可以帮助广大研究人员以自动化的方式检测和利用目标站点文件上传表单中的安全问题 由于该工具基于Python 3…

用ChatGPT自动生成流程图

我们看别人代码时&#xff0c;总希望有流程图&#xff0c;这样可以一目了然&#xff0c;不过自己写的代码&#xff0c;又不想花几个小时去画流程图。有没有更好的方法呢&#xff1f; 方法就是用ChatGPT等大模型自动生成流程图&#xff0c;并用python等语言实现自动输出流程图。…

第13篇:ESP32 idf wifi联网使用SNTP同步网络时间LCD ST7920液晶屏显示

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

什么是Jmeter?Jmeter使用的原理步骤是什么?

1.1 什么是 JMeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于 Web 应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI 脚…

贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析免疫球蛋白、前列腺癌数据...

原文链接&#xff1a;http://tecdat.cn/?p22702 贝叶斯回归分位数在最近的文献中受到广泛关注&#xff0c;本文实现了贝叶斯系数估计和回归分位数&#xff08;RQ&#xff09;中的变量选择&#xff0c;带有lasso和自适应lasso惩罚的贝叶斯&#xff08;点击文末“阅读原文”获取…

K8S集群中部署服务之应用环境配置

微服务项目sangomall应用环境配置说明 一、应用环境配置文件创建 可以创建多个application.properties或application.yml文件,通过关键配置进行激活使用&#xff0c;例如测试环境和生产环境等。 1.1 创建开发环境&#xff08;dev&#xff09; 名称&#xff1a;application-…

举例说明用 easylanguage 语言,编写抄底公式

EasyLanguage 语言在金融领域被广泛使用&#xff0c;尤其是用于编写交易策略和算法。以下是一个简单的抄底公式示例&#xff1a; swift 复制 // 定义变量和参数 Dim StopLossPrice As Double Dim TakeProfitPrice As Double Dim InitialPosition As Double Dim SafetyZon…

Docker 一键安装Confluence(已支持最新版本)

Docker 一键安装Confluence&#xff08;已支持最新版本&#xff09; 本文用于Confluence在Docker的安装&#xff0c;仅用于记录安装方式Jira 也可以参考这种方式安装&#xff0c;只有细微差别转载请注明来源Linux安装可参考链接Windows安装可查考链接条件允许时&#xff0c;请…

HTTP反爬困境

尊敬的程序员朋友们&#xff0c;大家好&#xff01;今天我要和您分享一篇关于解决反爬困境的文章。在网络爬虫的时代&#xff0c;许多网站采取了反爬措施来保护自己的数据资源。然而&#xff0c;作为程序员&#xff0c;我们有着聪明才智和技术能力&#xff0c;可以应对这些困境…

《存储IO路径》专题:四种IO栈大比武

1.Linux IO栈处理 我们就从一个常见Linux IO处理流程示意图开始今天的主题。 这个示意图主要描述了Linux系统中I/O请求的处理流程,涉及了I/O接口、文件系统、块层、NVMe驱动等多个部分,整个IO流程处理主要概括以下步骤: 1. 应用程序(Applications)将I/O请求提交给I/O接口…

腾讯mini项目-【指标监控服务重构】2023-07-19

今日已办 OpenTelemetry Logs 通过日志记录 API 支持日志收集 集成现有的日志记录库和日志收集工具 Overview 日志记录 API - Logging API&#xff0c;允许您检测应用程序并生成结构化日志旨在与其他 telemerty data&#xff08;例如metric和trace&#xff09;配合使用&am…

计算机专业毕业设计项目推荐06-工作室管理系统(Java+Vue+Mysql)

工作室管理系统&#xff08;JavaSpringVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较…

Postman —— post请求数据类型

1、Postman中post的数据类型 post中有以下数据类型 1、form-data 2、x-www-form-urlencoded 3、raw 4、binary 2、Postman请求不同的post数据类型 from-data multipart/form-data&#xff0c;它将表单的数据组织成Key-Value形式&#xff0c;也可以上传文件&#xff0c;当…

核心实验23_GRE over IPsec vpn_ENSP

项目场景&#xff1a; 核心实验23_GRE over IPsec vpn_ENSP 实搭拓扑图&#xff1a; 总部R3具体操作&#xff1a; 1.确保公网地址可达 [R3]ip route-static 0.0.0.0 0 23.1.1.2 [R4]ip route-static 0.0.0.0 0 24.1.1.22.创建安全提议以及安全策略 对数据加密和 认证的一个方…