前瞻断言与后瞻断言: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 浏览器中兼容性稍微差点,其他的都支持度很不错。

小结

相信通过上面的介绍,你已经掌握了使用 前瞻断言和后瞻断言的精髓了,相信我使用它可以让你写正则的速度嗖嗖的,下班早早的。

如果这篇文章对你有帮助,欢迎点赞👍、关注➕、转发 ✔ !

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

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

相关文章

【spring boot】初学者项目快速练手

一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 一、基础知识 1.注解 二、简介 三、项目结构 1.API/Controller层 业务控制层&#xff0c;控制业务层Service&#xff0c;并把数据返回给移动端和前端&#xff0c;直接转发Service的业务处理结果&#xff0c;…

Lora模型训练的参数-学习笔记

任何一个lora都会有三重属性&#xff0c;易调用性、泛化性和还原性&#xff0c;任何一个lora只能完美满足其中的两项&#xff1b; 易调用性&#xff1a;在已调用lora后&#xff0c;还需要多少提示词才能让该lora完全生效&#xff1b; 泛化性&#xff1a;能不能还原lora训练素…

新电脑怎么装系统?一文带你轻松搞定

对于刚刚购置的新电脑&#xff0c;安装操作系统是必不可少的一步。一个高效、稳定的操作系统能让您的新电脑发挥出最佳性能。本文将介绍新电脑怎么装系统的3种方法&#xff0c;每种方法都提供了详细的步骤说明&#xff0c;帮助您顺利完成系统安装。 方法1&#xff1a;通过网络安…

Java中锁的全面详解(深刻理解各种锁)

一.Monitor 1. Java对象头 以32位虚拟机位例 对于普通对象,其对象头的存储结构为 总长为64位,也就是8个字节, 存在两个部分 Kclass Word: 其实也就是表示我们这个对象属于什么类型,也就是哪个类的对象.而对于Mark Word.查看一下它的结构存储 64位虚拟机中 而对于数组对象,我…

基于python旅游景点满意度分析设计与实现

1.1研究背景与意义 1.1.1研究背景 随着旅游业的快速发展&#xff0c;满意度分析成为评估旅游景点质量和提升游客体验的重要手段。海口市作为中国的旅游城市之一&#xff0c;其旅游景点吸引了大量游客。然而&#xff0c;如何科学评估和提升海口市旅游景点的满意度&#xff0c;…

百度网盘Android一二面凉经(2024)

百度网盘Android一二面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《百度网盘Android一二面凉经(2024)》。 面试职位: 网盘主端研发组_Android高级研…

芯课堂 | SWM34S系列驱动TFT屏走线布局设计参考

​在TFT屏驱电路设计中&#xff0c;好的PCB板布局走线可以让调试更轻松&#xff0c;让EMC测试更容易通过&#xff0c;关于34S的PCB板设计应注意以下几点&#xff1a; 关于布局 在布局中需要尽量靠近MCU的元器件有&#xff1a;晶振电路所有元器件、复位电路RC、CAP滤波电容以及…

【AI大模型Agent探索】Qwen-Agent:基于Qwen的LLM应用开发框架

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

实战打靶集锦-31-monitoring

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址&#xff1a;https://download.vulnhub.com/monitoring/Monitoring.o…

Chapter12 屏幕后处理效果——Shader入门精要学习笔记

Chapter12 屏幕后处理效果 一、屏幕后处理概述以及基本脚本系统1.OnRenderImage 函数 —— 获取屏幕图像2.Graphics.Blit 函数 —— 使用特定的Shader处理3.在Unity中实现屏幕后处理的基本流程4.屏幕后处理基类 二、调整亮度、饱和度和对比度1.BrightnessSaturationAndContrast…

[计算机基础]一、计算机组成原理

计算机组成原理的考察目标为&#xff1a; 1. 掌握单处理器计算机系统中主要部件的工作原理、组成结构以及相互连接方式。 2. 掌握指令集体系结构的基本知识和基本实现方法&#xff0c;对计算机硬件相关问题进行分析&#xff0c;并能够对相关部件进行设计。 3. 理解计算机系统的…

001、Mac系统上Stable Diffusion WebUI环境搭建

一、目标 如标题所述&#xff0c;在苹果电脑&#xff08;Mac&#xff09;上搭建一套Stable Diffusion本地服务&#xff0c;以实现本地AI生图目的。 二、安装步骤 1、准备源码【等价于准备软件】 # 安装一系列工具库&#xff0c;包括cmake,protobuf,rust,python3.10,git,wge…

C#学习-刘铁猛

文章目录 1.委托委托的具体使用-魔板方法回调方法【好莱坞方法】&#xff1a;通过委托类型的参数&#xff0c;传入主调方法的被调用方法&#xff0c;主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话&#xff0c;如果通过&#xff0c;导演会…

请你谈谈:spring bean的生命周期 - 阶段2:Bean实例化阶段

在Spring框架中&#xff0c;Bean的实例化是Bean生命周期中的一个重要阶段。这个过程包括两个关键的子阶段&#xff1a;Bean实例化前阶段和Bean实例化阶段本身。 BeanFactoryPostProcessor&#xff1a;BeanFactoryPostProcessor是容器启动阶段Spring提供的一个扩展点&#xff0…

智慧城市遐想

很少有人会考虑自己居住的地方。我的意思是真正考虑效率、经济、美观和标准。我们甚至很少抬起头,将目光从智能手机上移开,去欣赏风景或享受城市风光。而且通常这是有道理的。 往日之城 过去,城市建在水源旁,距离河流或湖泊不超过一英里,这样才可以供水。现在,夜间飞越…

海豚调度器(DolphinScheduler)集群搭建详细笔记

海豚调度器集群搭建笔记 1.DolphinScheduler Cluster部署1.1 集群部署规划1.2 集群准备工作1.3 初始化数据库1.4 修改安装环境配置1.5 安装DolphinScheduler1.6 启停命令1.7 登录 DolphinScheduler UI 1.DolphinScheduler Cluster部署 分布式去中心化易扩展的工作流任务调度系…

中国机器视觉行业上市公司市场竞争格局分析

中国机器视觉产业上市公司汇总&#xff1a;分布在各产业链环节 机器视觉就是用机器来代替人眼做测量和判断的系统&#xff0c;机器检测相较于人工视觉检测优势明显。目前&#xff0c;我国机器视觉产业的上市公司数量较多&#xff0c;分布在各产业链环节。具体包括&#xff1a;…

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 配置篇 -- flash的使用 --(八)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

ClickHouse集成LDAP实现简单的用户认证

1.这里我的ldap安装的是docker版的 docker安装的化就yum就好了 sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl start docker 使用下面的命令验证sudo docker run hello-world docker pull osixia/openl…

RK3568笔记三十九:多个LED驱动开发测试(设备树)

若该文为原创文章&#xff0c;转载请注明原文出处。 通过设备树配置一个节点下两个子节点控制两个IO口&#xff0c;一个板载LED&#xff0c;一个外接LED。 一、介绍 通过学习设备树控制GPIO&#xff0c;发现有多种方式 一、直接通过寄存器控制 二、通过设备树&#xff0c;但…