什么?前瞻断言和后瞻断言居然可以这么牛?
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 浏览器中兼容性稍微差点,其他的都支持度很不错。
小结
相信通过上面的介绍,你已经掌握了使用 前瞻断言和后瞻断言的精髓了,相信我使用它可以让你写正则的速度嗖嗖的,下班早早的。
如果这篇文章对你有帮助,欢迎点赞👍、关注➕、转发 ✔ !

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
“SelectDB 实时数据仓库解决方案”入围工信部“信息技术应用创新典型解决方案”
7 月 11 日,由工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)主办的 2024 信息技术应用创新发展大会暨解决方案应用推广大会在天津落下帷幕,会上集中发布了一系列技术水平先进、应用效果突出、产业带动性强的信息技术创新工作成果。其中,由飞轮科技申报的“基于新一代实时数据仓库 SelectDB 的大数据分析方案” 从全国范围内征集的 1094 个有效方案中脱颖而出,荣获 “2023 年信息技术应用创新典型解决方案” 并入选大会典型案例集。 为了进一步推动行业深化应用,加快构建规模生态,激发产业自主创新活力,高效促进供需协同发展,加强区域联动和资源整合,工业与信息化部网络安全产业发展中心(工业和信息化部信息中心)联合北京、天津、浙江、福建、山东等全国各地信创产业管理机构,共同开展 2023 年(第五届)信息技术应用创新解决方案征集工作。 自 2023 年 7月启动以来,在全国范围内共征集有效方案 1094 个,覆盖党政、金融、能源、通信、交通、医疗、教育等重要行业领域和数百典型应用场景。历经方案征集、资格初审、专家中评 & 区域评议、专家答辩终评、综合复议等环节,最...
- 下一篇
表格集算表高性能原理:揭秘纯前端百万行数据秒级响应的魔法
最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 集算表 (Table Sheet)是一个具备高性能渲染、数据绑定功能、公式计算能力的数据表格,通过全新构建的关系型数据管理器结合结构化公式,在高性能表格的基础上提供排序、筛选、样式、行列冻结、自动更新、单元格更新等功能。 什么是集算表(Table Sheet)? 集算表是一个具有网络状行为和电子表格用户界面的快速数据绑定表的视图。 众所周知Excel的工作表(Work Sheet)是一个自由式布局,基于单元格(Cell Base)的表格,适用于一些松散式的数据布局展示,布局上来说非常灵活,但对于固定格式的大批量数据展示,不具备优势。 集算表不同于Excel的工作表,它是一个基于列(Column Base)的网状表格(Grid),适用于展示规则数据。同时它还具备了Excel工作表(Work Sheet)的用户界面和部分常见操作。并且支持Excel的部分计算功能。同时结合数据绑定的功能,对于大量固定格式的数据(例如数据库的表格)可以快速在前端进行展示。 集算表的特点正如它的名字的三个字...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- Mario游戏-低调大师作品
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 2048小游戏-低调大师作品