记录一次的正则匹配数字失败的问题
在一次开发中,需要匹配卡号,正则表达式较为复杂,想通过元字符进行简化,便由:
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了!当然,最开始提到的正则也是可以用的。
其实,该问题其实在教程里也是有提到的,还是需要打牢基础~
附上本次正则校验的规则,要是有更好的建议也可以提出~