【js正则】为什么/0|100/.test(‘101‘)的结果是true

前言

新公司的前端主管塞给我一本pdf的《JavaScript 正则表达式迷你书》(1.1版 - 老姚)

五一放假前的最后一小时,我想起来down了看一看。

原本的话,js正则相关,我查工具书的时候是翻得 正则表达式30分钟入门教程 ,然后测试的话一般会去 https://regex101.com  (设置里悬中文,语言风格选es)。

这个现象,有能力的人肯定一眼就看出来门道了,笔者比较笨拙,得多个环节拆下来一步一步矫正。

正则里的分支

正如迷你书里提到的,分支是惰性的,而且各分支之间可能会存在局部匹配,'100'和'0'正是这种情况。

RegExp.prototype.test()

RegExp.prototype.test() - JavaScript | MDN

值得笔者注意的是,test方法会在字符串里一旦有一个内容与正则表达式匹配的时候就返回true。

regex101.com上的复现

注意右上角的一次匹配。笔者之前错误的把此截图中的结果,解读成了“只要测试文本没有完全被匹配上,这则正则就不会被RegExp.prototype.test()返回true”。

实际上,截图里得出现"0次匹配"才能对应上RegExp.prototype.test()的false,只要不是0那test都会返true的。

解决问题

/0/ 去跑 '100' 会在匹到十分位上的0时就test返回true了,所以这分支得是有开始和结束的元字符 /^0$/ 。

同样的,另一个分支里/100/ 也得改成 /^100$/ , 于是正确的匹配0和100就得写成 /(^0$)|(^100$)/

当然,这个是可以合并成 /^(0|100)$/ 的。

/0|100/ 可以错误匹配内容可谓是五花八门的,比如'01'、'101'、'ab100'、'a0b'

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

devwolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值