记录一次的正则匹配数字失败的问题
在一次开发中,需要匹配卡号,正则表达式较为复杂,想通过元字符进行简化,便由:
new RegExp('^622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[01][0-9]|92[0-5])[0-9]{10,}$')
 
变成:
new RegExp('^622(12[6-9]|1[3-9]\d|[2-8]\d{2}|9[01]\d|92[0-5])\d{10,}$')
 
发现修改后,无论如何都匹配不上了
 
结论
最后发现,js创建正则表达式有两种方式:
- 字面量形式
 - 构造函数
 
当通过构造函数进行匹配时,需要符合字符转义规则。因此,当使用\d元字符通过构造函数进行正则表达式生成时,需要加上"\"(反斜杠),对元字符中的反斜杠进行转义。即:
let a = new RegExp("\d")     // a.test(1) === false
let b = new RegExp("\\d")    // b.test(1) === true
let c = new RegExp(/\d/)     // c.test(1) === true
let d = /\d/                 // d.test(1) === true
 
所以,将原先的正则修改成
 new RegExp('^622(12[6-9]|1[3-9]\\d|[2-8]\\d{2}|9[01]\\d|92[0-5])\\d{10,}$')
 
或
 new RegExp(/^622(12[6-9]|1[3-9]\d|[2-8]\d{2}|9[01]\d|92[0-5])\d{10,}$/)
 
或
/^622(12[6-9]|1[3-9]\d|[2-8]\d{2}|9[01]\d|92[0-5])\d{10,}$/
 
就ok了!当然,最开始提到的正则也是可以用的。
 
其实,该问题其实在教程里也是有提到的,还是需要打牢基础~
 附上本次正则校验的规则,要是有更好的建议也可以提出~
 














![[建议收藏] Mysql+ETLCloud CDC+Doris实时数仓同步实战](https://img-blog.csdnimg.cn/fd2c0ab9820443faa67d994272223b70.png)



