前瞻断言与后瞻断言:JavaScript 正则表达式的秘密武器
JavaScript 中的前瞻断言(lookahead)和后瞻断言(lookbehind)相信用过的小伙伴就知道它的威力了,在一些特定的需求场景下,可以做到四两拨千斤的作用,今天让我们来盘点一下在 JavaScript 正则表达式中这两个秘密武器吧。
前瞻断言和后瞻断言,在其他语言的正则表达式中也存在,这个特性不是 JavaScript 的专属
概念定义
不管是前瞻断言还是后瞻断言,最终目的都是寻找在指定的模式(pattern)下,这个指定模式(pattern)下前面或者后面的字符子串, 得到的结果永远是这些 前面或者后面的字符子串 而不是这个指定的模式(pattern)本身
前瞻或后瞻在匹配的时候不会实际匹配和捕获字符,只是检查某个位置前后是否符合指定条件,并不会改变正则的 lastIndex,在检查完之后,正则表达式的其他部分继续进行匹配。
前瞻断言
在中文互联网上 lookahead 被翻译成 前瞻断言、先行断言等
前瞻断言,是用于在检查后面的子串是否匹配某个模式, 前瞻断言包括正向前瞻和负向前瞻断言。
- 正向前瞻:
X(?=pattern)
,如果 X 后面的子串符合pattern
模式, 就匹配 X。 - 负向前瞻:
X(?!pattern)
, 如果 X 后面的子串不符合pattern
模式, 就匹配 X。
后瞻断言
在中文互联网上 lookahead 被翻译成 后瞻断言、后行断言等
后瞻断言,是用于在检查前面的子串是否匹配某个模式, 后瞻断言包括正向后瞻断言和负向后瞻断言。
- 正向后瞻:
(?<=pattern)X
,匹配 X 前面满足pattern
的子串。 - 负向后瞻:
(?<!pattern)X
,匹配 X 前面不满足pattern
的子串。
这里有点需要注意的是 前瞻断言是检查后面的子串是否匹配,后瞻断言是检查前面的子串是否匹配。
这个规则感觉就是主打一个叛逆…
直接上代码
前瞻断言
- 正向前瞻
利用正向前瞻实现金额字符串格式化为带有千分位分隔符的格式。 例如 12345
, 转化为 12,345
解释一下上述的正则表达式:
\B
:匹配非单词边界。确保逗号不会被添加在开头(?=(\d{3})+(?!\d))
:匹配符合右侧有一个或多个三位数字,且这些三位数字不是字符串的结尾。
这个正则同时使用了正向前瞻和负向前瞻。刚开始可能比较绕,可以看看下面的可视化原理慢慢消化一下
通过上述正则匹配到的结果,再使用 replace
方法用来替换为逗号, 即可实现金额的千分位
- 负向前瞻
我们可以用负向前瞻来过滤一些不符合条件的字符子串。例如下面我们需要匹配出不是金额的数字。
/\d+\b(?!元)/g
正则语法的意思是 “搜索 字符中的数字,但前提是后面没有 元 这个字符”。
\b
是用于匹配一个单词的边界。这里使用 \b 就是为了匹配完整的数字。不然上面的测试用例里面的15
中 的数字1
也符合属于数字,而且1
后面也没有跟 元 这个字符单词边界指的是在单词字符(字母、数字或下划线)和非单词字符(如空格、标点符号或其他字符)之间的位置,同时字符串的开头或结尾也存在单词的边界。
后瞻断言
- 正向后瞻
正向后瞻是如果当前匹配项前面有特定的匹配子串的话,当前匹配项就会被匹配,否则就跳过。
这里匹配 $
后面的金额, 我们可以用正向后瞻断言去匹配出来。只有这个数字前面的内容满足 $
就会匹配上,并返回到最终的结果中去。
- 负向后瞻
如果你刚看完上面的正向后瞻的示例代码,此时你想在上面的基础上,只匹配金额前面只有一个$
的, 这时候我们就可以用负向后瞻去做进一步约束。
这里使用 负向后瞻并不是最优解,这里只是为了做代码演示构造的场景。
可以从可视化正则里面看出,负向后瞻就是只要当前匹配项前面不是 $$
的时候,才进行匹配,所以 $$34
就会被忽略掉
不过为了应用这个例子,我这里是故意这样处理的,实际上为了满足只匹配一个 $
的金额数字的话,我们可以直接在上面的 正则加上 \s
即可, 即: /(?<=\s\$)\d+/g
兼容性
前瞻断言的兼容性是最好的,基本上是全绿的状态,直接无脑冲就行了。
当我查caniuse 的时候,有被震惊到,第一次遇到这种兼容性这么好特性。要是前端所有的标准属性有这兼容性就好了,好了,有点扯远了哈。
后瞻断言的兼容性差一些,除了在 Safari 浏览器中兼容性稍微差点,其他的都支持度很不错。
小结
相信通过上面的介绍,你已经掌握了使用 前瞻断言和后瞻断言的精髓了,相信我使用它可以让你写正则的速度嗖嗖的,下班早早的。
如果这篇文章对你有帮助,欢迎点赞👍、关注➕、转发 ✔ !
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/b331e2e9fa0eea0991ad6672bfad7d96.png)
前瞻断言与后瞻断言:JavaScript 正则表达式的秘密武器
JavaScript 中的前瞻断言(lookahead)和后瞻断言(lookbehind)相信用过的小伙伴就知道它的威力了,在一些特定的需求场景下,可以做到四两拨千斤的作用,今天让我们来盘点一下在 JavaScript 正则表达…...
![](https://i-blog.csdnimg.cn/direct/f85a676e84ac4ae0bce7aeb2e8e60bfe.png)
昇思MindSpore学习总结十六 —— 基于MindSpore的GPT2文本摘要
1、mindnlp 版本要求 !pip install tokenizers0.15.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行!pip install mindnlp0.3.1 !pip install mindnlp …...
![](https://www.ngui.cc/images/no-images.jpg)
React Router 6笔记
一个路由就是一个映射关系 key为路径,value可能是function或component 路由分类 后端路由(node) value是function,用来处理客户端提交的请求注册路由:router.get(path, function(req, res))工作过程:当…...
![](https://www.ngui.cc/images/no-images.jpg)
Android init 中的wait_for_property指令
Android开机优化系列文档-CSDN博客 Android 14 开机时间优化措施汇总-CSDN博客Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客A…...
![](https://www.ngui.cc/images/no-images.jpg)
智能合约语言(eDSL)—— 并行化方案——调度算法
3、调度算法 处理区块的时候,我们会同时启动多个线程去执行多个交易,这个时候我们需要一个良好的调度策略,来决定当前的线程是应该执行交易还是验证交易、提前结束还是立刻重新执行交易等,只有有一个良好调度策略才能保证所有交易都稳定有序的执行; 线程数量 这是一个不…...
![](https://www.ngui.cc/images/no-images.jpg)
vue2.0中如何实现数据监听
vue2中实现数据监听的原理 在Vue 2中,数据监听是通过ES5的Object.defineProperty实现的。Vue在初始化数据对象时,会遍历data对象,并使用Object.defineProperty为每个属性设置getter和setter。当你尝试读取或修改数据属性时,这些g…...
![](https://i-blog.csdnimg.cn/direct/350ad0f9ec4b476ba689d25dd6c8d8d0.png)
kafka开启kerberos和ACL
作者:恩慈 一、部署kafka-KB包 1.上传软件包 依次点击 部署中心----部署组件----上传软件包 选择需要升级的kafka版本并点击确定 2.部署kafka 依次点击部署中心----部署组件----物理/虚拟机部署----选择集群----下一步 选择手动部署-…...
![](https://www.ngui.cc/images/no-images.jpg)
QT+winodow 代码适配调试总结(三)
问题描述: 1、开发测试环境为: A: window10 64位 B: QT版本为4.8.6 C:采用VS2017 C++ Compiler 9.0 (x86)编译器版本 根据总结(二)经验,开发环境的可执行程序显示正常; 2、新的环境运行的时候显示乱码; 经过查阅资料,还是代码环境编码配置的问题,下面为解…...
![](https://img-blog.csdnimg.cn/direct/ee192b61bd234c87be9d198fb540140e.png)
Linux之旅:常用的指令,热键和权限管理
目录 前言 1. Linux指令 (1) ls (2) pwd 和 cd (3)touch 和 mkdir (4) rmdir 和 rm (5)cp (6)mv (7)…...
![](https://i-blog.csdnimg.cn/direct/cb648490fefe4b71b37e76a753ccf95f.png)
简单实用的企业舆情安全解决方案
前言:企业舆情安全重要吗?其实很重要,尤其面对负面新闻,主动处理和应对,可以掌握主动权,避免股价下跌等,那么如何做使用简单实用的企业舆情解决方案呢? 背景 好了,提取词…...
![](https://i-blog.csdnimg.cn/direct/e9f8b34679004312aba1d7640017d697.png)
【中项】系统集成项目管理工程师-第2章 信息技术发展-2.1信息技术及其发展-2.1.1计算机软硬件与2.1.2计算机网络
前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…...
![](https://www.ngui.cc/images/no-images.jpg)
SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表
Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 前言 …...
![](https://www.ngui.cc/images/no-images.jpg)
ubuntu 上安装中文输入法
在Ubuntu上安装中文输入法,通常有以下几种方法: 方法一:使用Fcitx输入法框架和搜狗输入法 安装Fcitx: sudo apt update sudo apt install fcitx fcitx-bin fcitx-table-all 安装搜狗输入法: 首先,从搜狗…...
![](https://i-blog.csdnimg.cn/direct/1cc472e7a03145589f8bf8269baa4cdf.png)
Postman导出excel文件
0 写在前面 在我们后端写接口的时候,前端页面还没有出来,我们就得先接口测试,在此记录下如何使用postman测试导出excel接口。 如果不会使用接口传参可以看我这篇博客如何使用Postman 1 方法一 2 方法二 3 写在末尾 虽然在代码中写入文件名…...
![](https://img-blog.csdnimg.cn/img_convert/df20eecb5aab870ca9877a3c3f344176.png)
你还在手动构建Python项目吗?PyBuilder让一切自动化!
在 Python 项目开发中,构建和管理项目是一项繁琐但必不可少的工作。你可能需要处理依赖项、运行测试、生成文档等。这时候,PyBuilder 出场了。它是一个强大的构建自动化工具,可以帮助你简化项目管理,让你更专注于编写代码。 什么…...
![](https://i-blog.csdnimg.cn/direct/7036e979c8fd4bc999aa506260a039af.png)
WebRTC音视频-前言介绍
目录 效果预期 1:WebRTC相关简介 1.1:WebRTC和RTC 1.2:WebRTC前景和应用 2:WebRTC通话原理 2.1:媒体协商 2.2:网络协商 2.3:信令服务器 效果预期 1:WebRTC相关简介 1.1&…...
![](https://www.ngui.cc/images/no-images.jpg)
centos/rocky容器中安装xfce、xrdp记录
最近需要一台机器来测试rdp连接,使用容器linuxxfcexrdp来实现,在此记录下主要步骤 启动rockylinux容器(其他linux发行版步骤应该相似) docker run -it -p 33891:3389 rockylinux:9.3 bash容器内操作 # 省略替换软件源步骤 ...# …...
![](https://img-blog.csdnimg.cn/img_convert/e4ebba6b3079ed7a2aaf156241cfd5d9.png)
实战:Eureka的概念作用以及用法详解
概叙 什么是Eureka? Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责…...
![](https://i-blog.csdnimg.cn/direct/e265fafb13af4e67a3fc6d5adf9cea18.jpeg)
jupyter_contrib_nbextensions安装失败问题
目录 1.文件路径长度问题 2.jupyter不出现Nbextensions选项 1.文件路径长度问题 问题: could not create build\bdist.win-amd64\wheel\.\jupyter_contrib_nbextensions\nbextensions\contrib_nbextensions_help_item\contrib_nbextensions_help_item.yaml: No su…...
![](https://img-blog.csdnimg.cn/img_convert/ef8fd1b0cf505c7d4f91432ca56f119a.png)
设计模式-Git-其他
目录 设计模式? 创建型模式 单例模式? 啥情况需要单例模式 实现单例模式的关键点? 常见的单例模式实现? 01、饿汉式如何实现单例? 02、懒汉式如何实现单例? 03、双重检查锁定如何实现单例ÿ…...
![](https://i-blog.csdnimg.cn/direct/6af594287d3649baa8746d1254c040a5.png)
【C#】计算两条直线的交点坐标
问题描述 计算两条直线的交点坐标,可以理解为给定坐标P1、P2、P3、P4,形成两条线,返回这两条直线的交点坐标? 注意区分:这两条线是否垂直、是否平行。 代码实现 斜率解释 斜率是数学中的一个概念,特别是…...
![](https://i-blog.csdnimg.cn/direct/342412485f9f4f2da4128b517472ccd0.png)
在项目服务器部署git 并实现自动提交
以下场景适合在服务器当中使用git 方便提交代码,同时不需要外部的git仓库(码云gitee或者github作为管理平台)。依靠服务器本身ssh 连接协议做为git提交的地址,同时利用钩子自动同步项目代码 首先下载git sudo apt update sudo a…...
![](https://www.ngui.cc/images/no-images.jpg)
前缀匹配工具之IP-Prefix
目录 基本概念: 技术背景: 用户需求: 安全需求: 企业内部的访问控制需求: IP-Prefix的配置与语句分析: 调用方式: 尾声 基本概念: IP-Prefix,即IP前缀,相比传统ACL,它能…...
![](https://www.ngui.cc/images/no-images.jpg)
等级保护测评案例分享及合规建议
一、黑龙江省等级保护测评概述 黑龙江省等级保护测评(简称“等保测评”)是依据国家网络安全等级保护制度的要求,对信息系统进行安全等级划分和安全保护能力的评估。等保测评不仅能够帮助企业和组织发现潜在的安全风险,还能够指导…...
![](https://i-blog.csdnimg.cn/direct/bba848a76d21448ca0ba37a219b2a305.png)
GOLLIE : ANNOTATION GUIDELINES IMPROVE ZERO-SHOT INFORMATION-EXTRACTION
文章目录 题目摘要引言方法实验消融研究 题目 Techgpt-2.0:解决知识图谱构建任务的大型语言模型项目 论文地址:https://arxiv.org/abs/2310.03668 摘要 大型语言模型 (LLM) 与指令调优相结合,在泛化到未见过的任务时取得了重大进展。然而,它…...
![](https://img-blog.csdnimg.cn/img_convert/d31dabad869688a0ab011883fb7573db.png#pic_center)
2024-07-19 Unity插件 Odin Inspector9 —— Validation Attributes
文章目录 1 说明2 验证特性2.1 AssetsOnly / SceneObjectsOnly2.2 ChildGameObjectsOnly2.3 DisallowModificationsIn2.4 FilePath2.5 FolderPath2.6 MaxValue / MinValue2.7 MinMaxSlider2.8 PropertyRange2.9 Required2.10 RequiredIn2.11 RequiredListLength2.12 ValidateIn…...
![](https://i-blog.csdnimg.cn/direct/c1411a0851794086b9710d8beac6dd3b.png)
跨平台WPF音乐商店应用程序
目录 一 简介 二 设计思路 三 源码 一 简介 支持在线检索音乐,支持实时浏览当前收藏的音乐及音乐数据的持久化。 二 设计思路 采用MVVM架构,前后端分离,子界面弹出始终位于主界面的中心。 三 源码 视窗引导启动源码: namesp…...
![](https://www.ngui.cc/images/no-images.jpg)
设计模式简述(一)
定义:设计模式指的是在软件开发过程中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。创建型设计模式关注对象的创建过程,提供了更灵活、可扩展的对象创建机制。结构型设计模式用于解决…...
![](https://www.ngui.cc/images/no-images.jpg)
OSI参考模型:解析网络通信的七层框架
引言 在现代计算机网络中,OSI(开放式系统互联)参考模型是理解和设计网络通信协议的基础。1978年由国际标准化组织(ISO)提出,OSI模型定义了网络通信的七层结构,每一层都承担着特定的功能&#x…...
![](https://i-blog.csdnimg.cn/direct/c8b21d5996e14ef7bf8e2a85c6c4a5d2.png)
QT通用配置文件库(QPreferences)
QT通用配置文件库(QPreferences) QPreferences项目是基于nlohmann/json的qt可视化配置文件库,将配置保存成json格式,并提供UI查看与修改,可通过cmake可快速添加进项目。默认支持基本类型、stl常用容器、基本类型与stl容器组成的结构体&#…...
![](https://static.geekbang.org/infoq/5c4e6e683ff65.png?imageView2/0/w/800)
厦门购买域名以后搭建网站/资源网站排名优化seo
关键要点 通过创建和维护架构图来提供准确且有价值的内容并非易事。大多数情况下,我们要么创建了太多的文档,要么太少,或者不相关,因为我们没能准确地定位文档的受益人及其实际的需求。我们常犯的最大的一个错误是为系统中具有高波…...
![](https://img-blog.csdnimg.cn/4b8e0ef9fbdb4f70aa5e20666f5b5b0e.jpg#pic_center)
wordpress顶栏/生意参谋指数在线转换
mule任务允许你发送消息给mule,增强了Flowable的集成功能。请注意,Mule任务不是 BPMN 2.0规范的正式任务(因此没有专门的图标)。因此,在Flowable中,mule任务被实现为一个专门的服务任务。 1、定义一个骡子…...
![](/images/no-images.jpg)
北京西站附近景点/免费seo网站推广
最近用java进行一个blowfish的加密算法,但是在我们的eclipse上报出Illegal key size的错误。google后发现原因是:ymmetricDS加密symmetric.properties中数据库密码产生"Illegal Key Size"错误 根据symmetricDS的guide文档,想要加密…...
![](https://img-blog.csdnimg.cn/20210712172454226.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg4OTg0MQ==,size_16,color_FFFFFF,t_70)
上海网站建设app/无锡网站排名公司
LockSupport是什么? “用于创建锁和其他同步类的基本线程阻塞原语。 ”,对于JDK官方文档上的介绍,听起来并不好懂。 是对线程唤醒机制Wait/Notify机制的改良版,提供Park()和unPark()两个方法来阻塞线程和解除阻塞。 Wait/Notif…...
![](/images/no-images.jpg)
查询网站建设/seo人员是什么意思
从股票市场崩溃到1932年(大萧条时期最惨的一年),经济一直在螺旋式下降,而这个下降趋 势又因为采取了某些措施的缘故而更加速了。按老规矩说,这些措施本该使经济复兴的,可 是事实恰好相反。为了保障投资者的利益,物价是…...