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

  玩转正则表达式等常用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=nil3) 如果出现'异常',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=nil3) 如果出现'异常',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中解析成\d2) 使用[[...]],在[[...]]里可以'直接被lua用',像这样[[\\d]]2、在'*_by_lua_file'中使用:1) \\d被lua解析一次为\d2) 用[[...]],直接使用'[[\d]]'备注:其他'转义字符'同理 案例:ngx.re.match(str,[[\w+z]],'ijo') --> 忽略大小写,'编译并缓存'

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

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

lua自身的正则表达式

openresty最佳实践    注解5

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

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

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

相关文章

集合减法【新思路】

#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所有元素作为数组下…

生产消费者模型的介绍以及其的模拟实现

目录 生产者消费者模型的概念 生产者消费者模型的特点 基于阻塞队列BlockingQueue的生产者消费者模型 对基于阻塞队列BlockingQueue的生产者消费者模型的模拟实现 ConProd.c文件的整体代码 BlockQueue.h文件的整体代码 对【基于阻塞队列BlockingQueue的生产者消费者模型…

windows系统安装php,运行php

一、安装php 官网&#xff1a;PHP For Windows: Binaries and sources Releases 下载最新的PHP解释器 解压好放入 C:\php 目录文件下 二、配置php 配置环境变量&#xff1a;在CMD命令提示符中输入以下命令&#xff0c;将PHP路径添加到系统环境变量中&#xff0c;以便可以在…

【第四阶段】kotlin语言集合转换与快捷转换学习

1.list可以通过转换为set进行去重 2.list转set在转list也能去重 3.使用快捷函数distinct进行去重 package Kotlin.Stage4fun main() {val list mutableListOf("java", "ktolin", "c", "java", "ktolin", "c")pr…

MyVector 的实现

myVector #include <iostream> #include <vector>int size20;using namespace std;template <typename type> class myvector {int size;type value;type *arr;public://无参构造myvector(){};//有参构造myvector(int s,type v):size(s),value(v){arrnew in…

laravel8框架-语言包的安装和配置

1, 查找 laravel框架语言包地址&#xff1a; \根目录\resources\lang\ 默认有个 en 语言包 2&#xff0c;下载 和 安装 下载地址&#xff1a;https://packagist.org/ 搜索 laravel/lang 参考网址&#xff1a;https://packagist.org/packages/overtrue/laravel-lang 选择你…

Django系列:Django简介与MTV架构体系概述

Django系列 Django简介与MTV架构体系概述 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/132890054 【介…

【数据结构】串的定义;存储结构;基本操作的实现

欢迎光~临~^_^ 目录 知识树 1、串的定义 2、串的存储结构 2.1顺序存储 静态存储 动态存储 2.2链式存储 2.3串的堆分配存储表示 3、串的基本操作 3.1求子串 3.2比较操作 3.3定位操作 4、C语言实现串的基本操作 知识树 1、串的定义 串是由零个或多个字符组成的…

记录一次IDEA非法字符‘\ufeff‘报错

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及Bug ✨特色专栏&#xff1a; …

JavaScript与jQuery(下篇)

JavaScript与jQuery笔记&#xff08;下篇&#xff09; 一、获取jquery二、jquery选择器三、jquery事件四、jquery操作Dom元素————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢…

Golang Gorm 创建HOOK

创建的时候&#xff0c;在插入数据之前&#xff0c;想要做一些事情。钩子函数比较简单&#xff0c;就是实现before create的一个方法。 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm" )type Student struct {ID int64Name string gorm:&q…

UDP通信

UDP通信 1、UDP2、UDP通信流程 1、UDP /* udp传输层协议&#xff0c;和tcp是一样的 特点:面向无连接的&#xff0c;不安全的&#xff0c;报式传输协议1&#xff0e;无连接:ldp通信的时候不需要connect1) 通信不需要建立连接2) 如果想给对方发送数据&#xff0c;只需要指定对方…

CRC(循环冗余校验码的校验方法)

5个关键点&#xff1a; 1.信息码&#xff1a;即给出要校验的二进制码 2.生成多项式&#xff1a;一般多项式会给&#xff0c;从最高位的指数位数就可以得到有几个校验码&#xff1b;如果没给多项式&#xff0c;肯定会给个多项式二进制码&#xff0c;根据它来推就行&#xff08;…

华为GaussDB数据库

Gauss数据库初识_高斯数据库_ygpGoogle的博客-CSDN博客 Redhat 7.6安装GaussDB_100_1.0.1详细攻略_gaussdb_100_1.0.1-database-redhat-64bit.tar.gz dow_博德1999的博客-CSDN博客 https://www.ngui.cc/el/3381579.html?actiononClick 初识GaussDB——GaussDB的发展历程、部…

Java基础(二十四):MySQL

文章目录 一、数据库&#xff08;创建、显示、删除、备份、恢复&#xff09;二、MySQL常用数据类型2.1 数值型&#xff08;整数&#xff09;2.2 数值型&#xff08;二进制bit&#xff09;2.3 数值型&#xff08;小数&#xff09;2.4 字符型2.5 日期类型 三、表结构的操作四、表…

软件设计师-UML基础教程

场景 针对UML1.5各种模型图的构成和功能进行说明。 UML概述 UML简介 UML (Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。 适用于描述以用例为驱动&#xff0c;以体系结构为中心的软件设计的全过程。 UML的定义包括UML语义和UML表…

【CVPR2021】MVDNet论文阅读分析与总结

Challenge&#xff1a; 现有的目标检测器主要融合激光雷达和相机&#xff0c;通常提供丰富和冗余的视觉信息 利用最先进的成像雷达&#xff0c;其分辨率比RadarNet和LiRaNet中使用的分辨率要细得多&#xff0c;提出了一种有效的深度后期融合方法来结合雷达和激光雷达信号。 MV…

输电线路故障诊断(Python代码,逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断)

效果视频&#xff1a;输电线路故障诊断&#xff08;Python代码&#xff0c;逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断&#xff09;_哔哩哔哩_bilibili 1.数据 仿真平台 仿真模型分别获取单相接地故障、两相接地故障、两相间短路故障、三相接地故障、…

2023年浦东新区数字化安全风险智慧管控技能比武初赛-技能题一

目录 二、技能题 2.1 MD5===MD5 三、业*&&&务**&&联&&&*&&系 二、技能题 2.1 MD5===MD5

线性代数的本质(九)——二次型与合同

文章目录 二次型与合同二次型与标准型二次型的分类度量矩阵与合同 二次型与合同 二次型与标准型 Grant&#xff1a;二次型研究的是二次曲面在不同基下的坐标变换 由解析几何的知识&#xff0c;我们了解到二次函数的一次项和常数项只是对函数图像进行平移&#xff0c;并不会改变…