百度工程师带你玩转正则

news2025/1/16 14:00:04

在这里插入图片描述

作者 | 向阳

导读

在很多技术领域,都有正则的身影。但许多像我一样的人,只闻其名。因此将正则常用知识汇总,便于查阅。正则表达式(Regular Expression)是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配目的工具。因此正则表达式是用于匹配字符串中字符组合的模式。

正则表达式可以很方便的提取我们想要的信息,所以正则表达式是一个很重要的知识点!欢迎大家一起学习~

全文4082字,预计阅读时间11分钟。

01 正则概述

正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。

02 基本语法

2.1 定义方式

字面量方式:/^\d+$/g,

new RegExp(“^\\d+$”, “g”)

2.2 修饰符

图片

2.3 元字符

一个正则表达式模式是由简单的字符所构成的,比如 /abc/;或者是简单和特殊字符的组合,比如 /ab*c/

图片

2.4 其他断言

断言的组成之一是边界。对于文本、词或模式,边界可以用来表明它们的起始或终止部分,分为边界类断言与其他断言。边界类断言有 ^, $, \b, \B,其他断言有 x(?=y), x(?!y), (?<=y)x, (?<!y)x。

图片

注:需要关注写法与真正匹配到的字符串!!!

03 正则对象的属性和方法

3.1 属性

图片

△正则属性和方法

图片

var reg=/ab/g;
reg.ignoreCase; // false,检测是否含有i 属性
reg.global; // true,检测是否含有g 属性
reg.multiline; // false,检测是否含有m 属性
reg.source; // "ab",匹配内容体
var regex =new RegExp("\u{61}","u");
regex.unicode // true
const str1 = "foo bar foo";
const regex1 = /foo/dg;
regex1.hasIndices // Output: true
regex1.exec(str1).indices[0] // Output: Array [0, 3]
regex1.exec(str1).indices[0] // Output: Array [8, 11]
const str2 = "foo bar foo";
const regex2 = /foo/;
regex2.hasIndices // Output: false
regex2.exec(str2).indices // Output: undefined

3.2 相关方法

这些模式被用于RegExp的exec和test方法,以及String的match、matchAll、replace、search和split方法。

图片

test

/str/.test('hello world');  //要求字符串包含string,所以返回false

exec

 var reg=/ab/g;
 var str="abababab";
 reg.lastIndex //0
 reg.exec(str)//["ab",index:0,input:"abababab"]
reg.lastIndex//2
reg.exec(str)//["ab",index:2,input:"abababab"]
reg.lastIndex//4
reg.exec(str)//["ab",index:4,input:"abababab"]
reg.lastIndex//6
reg.exec(str)//["ab",index:6,input:"abababab"]
reg.lastIndex//8
reg.exec(str)//null
reg.lastIndex//0
reg.exec(str)//["ab",index:0,input:"abababab"]

//reg.lastIndex是可手动修改的
reg.lastIndex=0; // reg.lastIndex重置0
reg.exec(str)
// ["ab",index:0,input:"abababab"],与上面结果中的index相同

// 若匹配规则不含有global属性,那在允许exec()方法后lastIndex值始终为0
var reg=/ab/;
var str="abababab";
reg.lastIndex // 0
reg.exec(str) // ["ab",index:0,input:"abababab"]
reg.lastIndex // 0
reg.exec(str) // ["ab",index:0,input:"abababab"]

search

"hello world".search(/w/) // 6

match

const str = "hello world";
const reg1 = /o/;
str.match(reg1); // ['o', index: 4, input: 'hello world', groups: undefined]
const reg2 = /o/g;
str.match(reg2); // ['o', 'o']

replace

"hello world".replace(/world/g,"baidu"); // hello baidu

split

var str="a1b2c";
var reg=/\d/g;
str.split(reg); // ["a","b","c"],即将分隔符两侧的字符串进行拆分
var reg=/(\d)/g; // "()"代表记录反向引用,将匹配表达式也返回回来
str.split(reg); // ["a","1","b","2","c"]

04 捕获组与非捕获组

正则表达式分组分为捕获组(Capturing Groups)与非捕获组Non-Capturing Groups。正则里面是用成对的小括号来表示分组的,如(\d)表示一个分组,(\d)(\d)表示有两个分组,(\d)(\d)(\d)表示有三个分组,有几对小括号元字符组成,就表示有几个分组。

4.1 分组的目的

  1. 作为可选分支

  2. 简写重复模式

  3. 缓存捕获数据及反向引用(只有捕获组才可以被反向引用)

4.2 捕获组

当你把一个正则表达式用一对小括号包起来的时候,就形成了一个捕获组。它捕获的就是分组里面的正则表达式匹配到的内容。

/(\w)+/.test('hello world') //(\w)组成一个捕获组

4.3 非捕获组

/(?:\w)+/.test('hello world') //(\w)组成一个捕获组

使用场景:

不需要用到分组里面的内容的时候,用非捕获组,主要是为了提升效率,因为捕获组多了一步保存数据的步骤,所以一般会多耗费一些时间。

4.4 命名捕获组

捕获组其实是分为编号捕获组Numbered Caputuring Groups和命名捕获组Named Capturing Groups的,我们上面说的捕获组,默认指的是编号捕获组。命名捕获组,也是捕获组,只是语法不一样。命名捕获组的语法如下:(?group) 或 (?'name’group),其中 name 表示捕获组的名称,group 表示捕获组里面的正则。

const str = '2022-12-15';
const reg =  /(\d{4})-(\d{2})-(\d{2})/;
str.match(reg)
// ['2022-12-15', '2022', '12', '15', index: 0, input: '2022-12-15', groups: undefined]
const isNotCaputuringReg = /(?:\d{4})-(?:\d{2})-(?:\d{2})/;
str.match(isNotCaputuringReg)
// ['2022-12-15', index: 0, input: '2022-12-15', groups: undefined]
const namedCaputuringReg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
str.match(namedCaputuringReg)
// 匹配结果如下图

图片

05 正则中有趣用法

5.1 贪婪匹配与非贪婪匹配

贪婪匹配即照着"量词"规则中要求的更多个的情况去做匹配。

非贪婪匹配,在"量词"规则后边多加一个问号"?"。

"量词"包括 ?、*、+、{}、{n,}、{n,m}

    var str="aaaaa";
    var reg=/a+/g;
    str.match(reg);//["aaaaa"]
    var reg=/a??/g;//第一个问号代表0~1个,第二个问号代表能取0就不取1去做匹配
    str.match(reg);//["","","","","",""]

5.2 反向引用

反向引用就是正则中’ \1 ‘用法,下列代码中(\w)首先匹配a,’\1’引用a,后面量词’+'表示出现一次获多次。

var str = 'aaaaabbbbbbcccccccd'
var reg = /(\w)\1+/g
str.replace(reg,'$1') // $1是第一个小括号中的内容
// abc

06 易错用法

/[1-51]/.test('6')
'aaa'.match(/a*?/g)
false // 可匹配1,2,3,4,5,同(1-5||1)
['', '', '', ''] //注意:字符串有三个a,数组有四个空字符串

——END——

参考资料:

[1]菜鸟教程:

https://www.runoob.com/regexp/regexp-intro.html

[2]MDN:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test

推荐阅读:

Diffie-Hellman密钥协商算法探究

贴吧低代码高性能规则引擎设计

浅谈权限系统在多利熊业务应用

分布式系统关键路径延迟分析实践

百度工程师教你玩转设计模式(装饰器模式)

百度工程师带你体验引擎中的nodejs

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

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

相关文章

机械--UG NX2007改变零件的默认颜色

UG&#xff08;现在的新版本叫NX&#xff0c;但一般人仍然沿用UG的叫法&#xff0c;下同&#xff09;&#xff0c;新建零件时&#xff0c;零件的默认颜色是橙色的&#xff0c;个人很不喜欢。 当然&#xff0c;实体化以后&#xff0c;可以改变它的颜色&#xff0c;选中实体以后…

傻瓜式裂变—竖屏视频超级原创,呆头鹅批量剪辑软件上万人使用

呆头鹅批量剪辑软件优势&#xff1a; 专业的技术开发团队&#xff0c;成熟的技术架构&#xff0c;完整的售后服务&#xff0c;我们为您解决所有的后顾之忧 .几乎涵盖市面上已知的所有剪辑功能.几乎涵盖市面上已知的所有剪辑功能.完成通知&#xff0c;运行间隔提醒&#xf…

201:vue+openlayers:加载geojson文件形成围栏,可添加、修改、删除feature,导出geojson

第201个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中实现围栏列表与图中feature双向互动功能。 利用GeoJSON().readFeatures获得到features,通过转换在地图上形成图形,通过新增、修改、删除feature,可以更改整体的features关系。点击导出可以将修改后的…

工厂安全着装识别检测算法 python

工厂安全着装识别检测算法通过Python基于YOLOv5技术&#xff0c;对现场画面中的人员着装穿戴进行实时分析检测自动抓拍存档告警。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流行&#xff0c;主要是因为它的简单性和代码可读性。它使程序员…

现在才开始学测试晚了么

相信问这样问题的朋友&#xff0c;对软件测岗位存在着很深的误解。实际上&#xff0c;相对于其他的技术岗位来讲&#xff0c;软件测试入门可以说是相对简单的了&#xff0c;因此多晚学习都来得及。其次&#xff0c;这个行业的就业前景广阔&#xff0c;像测试主管、自动化架构师…

k8s之Service

写在前面 本文接k8s之DaemonSet 。 通过Deployment我们可以实现一直有指定个数的POD在运行&#xff0c;而通过DaemonSet可以实现在每个Node上都有一个POD在运行&#xff0c;不管是这两种方式中的哪一种&#xff0c;都是仅仅实现了有若干个POD在运行的效果&#xff0c;但是还无法…

【AdaBoost算法】

AdaBoost算法的原理介绍 AdaBoost算法核心思想 AdaBoost算法 (Adaptive Boosting) 是一种有效而实用的Boosting算法&#xff0c; 它以一种高度自适应的方法顺序地训练弱学习器。AdaBoost根据前一次的 分类效果调整数据的权重&#xff0c;上一个弱学习器中错误分类样本的权重会…

【MySQL】易忘易错函数和经典例题

目录一、函数1. UNION ALL 以及 UNIONUNION ALLUNION2. group_concat二、例题&#xff1a;1. 列转行2. 行转列3. 查找第N高的数据&#xff0c;没有则返回null一、函数 1. UNION ALL 以及 UNION union&#xff1a;对多个结果&#xff0c;去重排序 union all&#xff1a;对多个…

AB测试——原理介绍(中心极限定理、大数定理、假设检验、两类错误)

作为AB测试的学习记录&#xff0c;本文主要整理总结了AB测试背后的数学原理和一些概念解释。 1、控制变量法 基于控制变量法的思想&#xff0c;通过对比两组样本&#xff08;实验组和对照组&#xff09;的表现是否有差异&#xff0c;从而验证“变量”的作用。 借用中学生物课…

Linux常用命令——xauth命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) xauth 显示和编辑被用于连接X服务器的认证信息 补充说明 xauth命令用于显示和编辑被用于连接X服务器的认证信息。 语法 xauth(选项)(参数)选项 -f&#xff1a;不使用默认的认证文件&#xff0c;而使用指定的…

动手深度学习-线性神经网络:softmax回归

目录1.分类问题2. 网络架构3.softmax运算4. 损失函数交叉熵损失函数参考教程&#xff1a;https://courses.d2l.ai/zh-v2/ 1.分类问题 从回归到多类分类&#xff1a;对类别进行一位有效编码——独热编码&#xff08;one-hot encoding&#xff09;。 独热编码是一个向量&#x…

HTTP与HTTPS的区别,HTTPS提高性能,HTTP2的新特性

目录数据传输区别安全性区别端口区别交互区别HTTPS的工作流程HTTPS的实现原理机密性完整性身份认证和不可否认HTTPS 使用流程HTTPS性能优化点HTTP2的特性向下兼容HTTP/1头部压缩二进制虚拟流、多路复用数据传输区别 http也相当于HTTP协议&#xff0c;是超文本传输协议的意思&a…

PyQt6快速入门-多文档界面(MDI)

多文档界面(MDI) 文章目录 多文档界面(MDI)1、子窗口创建2、主窗口创建3、运行结果多文档界面(Multi Document Interface,MDI)是一种应用程序界面管理方法。MDI应用程序一般由一个主窗口和多个子窗口组成,这些子窗口在主窗口里显示,并共享主窗口的菜单栏,工具栏。在MDI应用…

netty(1):NIO 基础之三大组件和ByteBuffer

1 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 stream 要么是输入&#xff0c;要么是输出&…

C++生成.dll文件后在Python中引用(包括传递参数是double型、char*数组,接收参数也为数组)

一、问题描述 博主想要实现的C函数原型如下&#xff1a; double* getInfo(int flag, double xyz[], char *xodrPath)也就是需要传递参数为三个不同类型的参数&#xff0c;返回值为double类型的指针&#xff08;数组&#xff09;。 那么如何在Python中如何通过这个函数生成的…

完全兼容GM8775C方案|替代GM8775C设计|CS5518替代GM8775C DSI转双LVDS设计方案

GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS功能。GM8775C输入端DSI符合 协议支持 MIPI D-PHY 1.00.00 和MIPI DSI 1.02.00&#xff0c;可实现 1 到 4通道 DSI 信号接收。最大数据率 1Gbps/通道。视频输入格式支持 16bit RGB565、18bit RGB6…

Mybatis 一对一、一对多、多对多

今天我们来复习一下 Mybatis 框架吧 总所周知&#xff0c;Mybatis 是一款优秀的 基于ORM 半自动 轻量化 的 持久层框架 ORM&#xff1a;对象关系映射&#xff0c;简单的说就是表结构对应实体类 半自动&#xff1a;可灵活配置SQL&#xff0c;优化代码性能 轻量化&#xff1a…

php源代码保护——PHP加密方案分析解密还原

前言 php是一种解释型脚本语言.与编译型语言不同,php源代码不是直接翻译成机器语言.而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行 . 在php源代码的保护在原理可以分为3大类. 源代码混淆(编码)OPCODE混淆(编码)修改解释引擎(虚拟机) 在部署上可…

Vue学习笔记 ④

文章目录template 选项Vue 生命周期生命周期图示生命周期钩子beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed组件基础组件是什么&#xff1f;组件注册全局组件局部组件组件名组件复用自闭合组件组件的 data 选项单个根元素组件\_Prop注册自定…

怎么排除无效问卷?

目录 1、答题限制 1&#xff09;设置问卷验证码/密码 2&#xff09;设置填写唯一链接 2、题目设置 1&#xff09;设置陷阱题目 2&#xff09;打乱题目顺序 3&#xff09;设置跳转逻辑 4&#xff09;题目数量限制 3、问卷筛选 问卷调查是一种能够在进行社会调研时帮助我…