VM1821:1 Uncaught SyntaxError: Invalid regular expression: /+zhiriui+/: Nothing to repeat at new RegExp (<anonymous>)

@zhirui1994 2019-01-12 10:40:10发表于 zhirui1994/zhirui1994.github.io BUGJavaScript

起因

当我想通过RegExp 对象和模版字符串变量动态的创建需要的正则,匹配+zhirui1994+或者+zhirui1994.github.io+时遇到了Nothing to repeat at new RegExp()报错,操作如下:

const user = 'zhirui1994';
const repo = 'zhirui1994.github.io';
const regexp = new RegExp(`(\+${user}\+|\+${repo}\+)`, 'g');
// 输出:VM1821:1 Uncaught SyntaxError: Invalid regular expression: /+zhiriui+/: Nothing to repeat at new RegExp (<anonymous>)

原因

Nothing to repeat at new RegExp (),说的是正则符号+之前没有可重复的内容所以导致语法错误。
但是,实际上我是想匹配+所以在+前加了\也是这个意图。
不过,字符串在js解析的过程中其实是会忽略\符号的,所以字符串\+在通过RegExp对象解析过后就变成了+,要想显示\就需要写成\\才行。
主要原因其实就是我没有考虑到,通过RegExp生成正则会把规则字符串解析一次。

解决方案

我们只需要把\符号显示在规则中就行,如下:

const user = 'zhirui1994';
const repo = 'zhirui1994.github.io';
const regexp = new RegExp(`(\\+${user}\\+|\\+${repo}\\+)`, 'g');
// 最后生成的规则: \(\+zhirui1994\+|\+zhirui1994.github.io\+)\g