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的生产者消费者模型…

Oracle 给字段加注释SQL

在Oracle中&#xff0c;可以使用COMMENT关键字为表中的字段添加注释。下面是使用COMMENT关键字为字段添加注释的SQL示例&#xff1a; 创建一个表 CREATE TABLE employees ( employee_id NUMBER, first_name VARCHAR2(100), last_name VARCHAR2(100)); 为employee_id字段…

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 【介…

MATLAB算法实战应用案例精讲-【数模应用】NP-hard问题

目录 前言 几个高频面试题目 NP难问题和NP完全问题的区别 P问题、NP问题、NP完全

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

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

大二第二周总结

问题&#xff1a; 想到了之前追的辩论赛&#xff0c;主题是“被误解是表达者的宿命”&#xff0c; 反方认为被误解不是表达者的宿命&#xff1a; 由于表达者表意含混造成误解的可能性是人力可控的&#xff0c;表达者可在真诚沟通的基础之上&#xff0c;根据对方反应不断调整…

记录一次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…

生成元 rust解法

如果x加上x的各个数字之和得到y&#xff0c;就说x是y的生成元。给出n&#xff08;1≤n≤100000&#xff09;&#xff0c;求n的最小生成元。无解输出0。例如&#xff0c;n216&#xff0c;121&#xff0c;2005时的解分别为198&#xff0c;0&#xff0c;1979。 【分析】 本题看起来…

Python基本语法_集合setfrozenset_内建方法详解

集合是一种组合型的数据类型,分为可变的set和不可变的frozenset。 软件环境 系统 UbuntuKylin 14.04软件 Python 2.7.3IPython 4.0.0可变集合Set

UDP通信

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

使用键盘控制Franka机械臂运动

功能说明 使用键盘按键&#xff0c;可以控制franka机械臂7个关节角&#xff0c;已在真机上验证。 代码 主要使用的是官方包内的 franka_example_controllers 1、修改 include下的 joint_position_example_controller.h, 改为如下&#xff1a; // Copyright (c) 2017 Frank…

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

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

群体AI介绍

本文为介绍性文章&#xff0c;只是为了扩宽视野。 群体AI 1、简介 群体AI&#xff0c;也称为集体智能&#xff08;collective intelligence&#xff09;&#xff0c;是指通过联合多个智能体&#xff08;如人类、机器或其他智能系统&#xff09;的智能和资源来解决问题的一种方…