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.rhkb.cn/news/132765.html

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

相关文章

IJK源码分析-android篇

整个IJK播放器框架相较于原始ffplay.c播放器,在三处进行了抽象,分别是: (1)解码器配置初始化操作,对应的数据结构是: struct IJKFF_Pipeline {SDL_Class *opaque_class;IJKFF_Pipeline_Opaque *opaque;void (*func_destroy) (IJKFF_Pipe…

合宙Air724UG LuatOS-Air LVGL API控件-微调框 (Spinbox)

微调框 (Spinbox) 微调框用于数值调整,有时候我们希望获取一个用户输入的数值,但是又不希望弹出键盘,可以使用微调框。 示例代码 -- 回调函数 function spinbox_increment_event_cb(obj, event)if event lvgl.EVENT_SHORT_CLICKED thenlvg…

openssl websockets

1. HTTPS通信的C实现 - 知乎

fluent python part3 一等函数

第 5 章 一等函数 5.1 把函数视作对象 >>> def factorial(n): ... """return n!""" ... return 1 if n < 2 else n * factorial(n - 1) ... >>> factorial(42) 140500611775287989854314260624451156993638400000…

【物联网】简要介绍最小二乘法—C语言实现

最小二乘法是一种常用的数学方法&#xff0c;用于拟合数据和寻找最佳拟合曲线。它的目标是找到一个函数&#xff0c;使其在数据点上的误差平方和最小化。 文章目录 基本原理最小二乘法的求解应用举例使用C语言实现最小二乘法总结 基本原理 假设我们有一组数据点 ( x 1 , y 1 …

pandas读取一个 文件夹下所有excel文件

我这边有个需求&#xff0c;是要求汇总一个文件夹所有的excel文件&#xff0c; 其中有.xls和 .xlsx文件&#xff0c;同时还excel文件中的数据可能还不一致&#xff0c;会有表头数据不一样需要一起汇总。 首先先遍历子文件夹并读取Excel文件&#xff1a; 使用os库来遍历包含子文…

LeetCode 面试题 04.09. 二叉搜索树序列

文章目录 一、题目二、C# 题解 一、题目 从左向右遍历一个数组&#xff0c;通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。 给定一个由不同节点组成的二叉搜索树 root&#xff0c;输出所有可能生成此树的数组。 点击此处跳转题目。 示例 1: 输入: root [2,1,3]…

记录:移动设备软件开发(activity组件)

目录 前言Android简介和发展Android应用的基本组件介绍Activity组件Activity简介Activity的状态和生命周期 小结 前言 移动设备软件开发是指为智能手机、平板电脑等移动设备设计和开发应用程序的过程。移动设备软件开发涉及多种技术、平台和工具&#xff0c;例如Android、iOS、…

9.14号作业

仿照vector手动实现自己的myVector&#xff0c;最主要实现二倍扩容功能 有些功能&#xff0c;不会 #include <iostream>using namespace std; //创建vector类 class Vector { private:int *data;int size;int capacity; public://无参构造Vector(){}//拷贝构造Vector(c…

一个方法用js生成随机双色球、大乐透

代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

002 Linux 权限

前言 本文将会向您介绍关于linux权限方面的内容&#xff0c;包括文件类型&#xff0c;如何切换用户、基本权限、粘滞位等等 Linux具体的用户 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的…

NDK (ndk)报错 Unity requires NDK r19 (64-bit)(19.0.05232133)

一、介绍 在 Android 添加 NDK ndk 的时候&#xff0c;出现 Unity requires NDK r19 (64-bit)(19.0.05232133)。 二、环境 1、Unity 2020.3.48f1c1 2、Android NDK 配置 三、报错信息 NDK (ndk)报错 Unity requires NDK r19 (64-bit)(19.0.05232133) 四、解决方法 1、下…

【力扣每日一题】2023.9.13 检查骑士巡视方案

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个n*n大小的矩阵&#xff0c;矩阵的元素表示骑士已经行动的次数&#xff0c;问我们骑士能不能按照矩阵里元素顺序来巡视整个…

vue前后端分离单点登录,结合长token和短token进行登录

单点登录背景 在公司发展初期&#xff0c;公司拥有的系统不多&#xff0c;通常一个两个&#xff0c;每个系统都有自己的登录模块&#xff0c;运营人员每天用自己的账号登陆&#xff0c;很方便&#xff0c;但是&#xff0c;随着企业的发展&#xff0c;用到的系统随之增加&#x…

06-Redis缓存高可用集群

上一篇&#xff1a;05-Redis高可用集群之水平扩展 1.集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c…

指引型树型组件的封装

最近&#xff0c;由于业务的需要&#xff0c;需要做一个指向形树型组件。在寻找各种文章后&#xff0c;终于有了思路。&#x1f912;&#x1f912;&#x1f912; 树型组件的思路主要是递归。谈到递归&#xff0c;我们首先要有递归的出口。递归的出口就是没有孩子节点了。这个时…

ESP32主板-MoonESP32

产品简介 Moon-ESP32主板&#xff0c;一款以双核芯片ESP32-E为主芯片的主控板&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;低功耗&#xff0c;板载LED指示灯&#xff0c;引出所有IO端口&#xff0c;并提供多个I2C端口、SPI端口、串行端口&#xff0c;方便连接&#xff0c;…

性能监控-grafana+prometheus+node_exporter

Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布&#xff0c;后来成为了一个独立的开源项目&#xff0c;并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据&#xff0c;并提供强大的查询语言PromQL来…

【C++基础】观察者模式(“发布-订阅”模式)

本文参考&#xff1a;观察者模式 - 摩根斯 | 爱编程的大丙 观察者模式允许我们定义一种订阅机制&#xff0c;可在对象事件发生时通知所有的观察者对象&#xff0c;使它们能够自动更新。观察者模式还有另外一个名字叫做“发布-订阅”模式。 发布者&#xff1a; 添加订阅者&…

K8s上安装gitlab-ce

文章目录 K8s上安装gitlab-ce操作如下gitlab-deployment.yml K8s上安装gitlab-ce 前言   使用pv-pvc来持久化gitlab的数据&#xff0c;配置&#xff0c;日志文件。   pod启动后需要需要修改external_url然后重启pod。 操作如下 mkdir -p /mnt/data01/gitlab ctr -n k8s.…