前言
新公司的前端主管塞给我一本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'