JavaScript使用new RegExp检测字符串含数字时返回false的问题
排查&修正方案
核心错误点
- 代码中所有字符串的边界引号用了中文全角单引号(即
‘’这类弯引号),JavaScript解析器无法识别这类引号,会直接触发语法错误,导致正则初始化流程异常。 - 即使替换为英文半角引号,
new RegExp()构造函数的入参存在转义失效问题:JavaScript普通字符串会优先解析转义符,你写的'.*\d.*'经过字符串解析后,实际传入正则的规则是.*d.*——也就是匹配任意包含小写字母d的字符串,完全失去了匹配数字的能力,自然测试带数字的字符串也返回false。
可正常运行的修正写法
方案1:优先使用正则字面量(无转义坑,最简洁)
不需要手动写转义,直接用正则字面量定义匹配规则,且无需前后加.*(test()方法只要在字符串中找到任意位置匹配的子串就会返回true):
// vars var regex = /\d/; var str = 'Scorpio08'; // main function reg1() { if (regex.test(str)){ console.log('true'); }else{ console.log('false'); } } reg1();
方案2:必须使用new RegExp()构造函数时的正确写法
因为正则的转义序列需要经过两次解析(先JS字符串解析,再正则引擎解析),所以正则内的\d要写成\\d,确保最终传给正则引擎的是正确的数字匹配规则:
// vars var regex = new RegExp('.*\\d.*'); var str = 'Scorpio08'; // main function reg1() { if (regex.test(str)){ console.log('true'); }else{ console.log('false'); } } reg1();
注意:使用构造函数生成正则时,所有正则规则里用到的反斜杠转义符,都需要在JS字符串里额外加一次反斜杠转义,否则会因为字符串解析提前吃掉反斜杠,导致正则规则失效。
内容的提问来源于stack exchange,提问作者Ezikiel
相关产品推荐
相关产品推荐

