为何匹配英国手机号的该正则表达式无效?
为什么你的RegExp实例创建失败?
哥们,问题出在JavaScript字符串的转义规则上!当你用RegExp构造函数创建正则时,传入的是字符串参数,而字符串里的反斜杠\是特殊转义字符——它会被JavaScript先解析一次,然后才传给正则引擎。
举个简单例子:你原正则里的\(,在字符串中会被JavaScript直接解析成(,失去了正则里“转义括号”的作用,这就导致正则引擎拿到的是不符合语法的表达式,自然就无效了。
解决方法:双重转义反斜杠
你需要把原正则里的每一个\都替换成\\,这样JavaScript解析字符串时会把\\转成单个\,正则引擎才能正确识别它的转义含义。
修正后的代码应该是这样的:
const myRegex = new RegExp('^\\(?(?:(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)44\\)?[\\s-]?\\(?(?:0\\)?[\\s-]?\\(?)?|0)(?:\\d{2}\\)?[\\s-]?\\d{4}[\\s-]?\\d{4}|\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{3,4}|\\d{4}\\)?[\\s-]?(?:\\d{5}|\\d{3}[\\s-]?\\d{3})|\\d{5}\\)?[\\s-]?\\d{4,5}|8(?:00[\\s-]?11[\\s-]?11|45[\\s-]?46[\\s-]?4\\d))(?:(?:[\\s-]?(?:x|ext\\.?\\s?|\\#)\\d+)?)$');
小建议
如果没有动态生成正则的需求,优先使用正则字面量语法,这样不用处理双重转义的麻烦,代码也更清晰:
const myRegex = /^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$/;
内容的提问来源于stack exchange,提问作者mo.dhouibi
相关产品推荐
相关产品推荐

