使用字面量创建正则表达式
通过双斜杠之间的内容来创建正则表达式,并在第二个斜杠后注释该表达式的标志(flags)。这种方式创建的正则表达式会在Javascript文件加载后,立马编译该正则表达式字面量,并在代码的常量声明处引用编译状态。
const regex = /abc/gi;
使用RegExp构造函数创建正则表达式
调用RegExp的构造函数,并通过两个参数(第二个参数可选)来实例化创建一个正则表达式。这种方式创建的正则表达式只会在代码执行到该处时才会进行正则表达式的编译。
const regexText = 'abc'
const regex_1 = new RegExp(regexText);
// 或者直接通过字符串字面量作为构造函数的参数
const regex_2 = new RegExp('abc');
也可以将正则表达式的字面量传入构造函数中。
const regex = new RegExp(/abc/);
还可以将一个正则表达式对象作为参数传入构造函数
const regexp_1 = new RegExp('aaa');
const regexp_2 = new RegExp(regexp_1);
构造函数接收第二个参数,作为正则表达式的标志(flags)。如果使用带有标志的正则字面量或正则对象,且指定了第二个参数,最终将会用第二个参数覆盖第一个参数的正则中的标志,以创建一个新的正则表达式。
const regexp_1 = new RegExp(/aaa/gi, 'g');
console.log(regexp_1);
// /aaa/g
const regexp_2 = new RegExp(regexp_1, 'gmi');
console.log(regexp_2);
// /aaa/gim
字面量和构造函数创建正则对象的区别
字面量是通过硬编码的形式来创建正则表达式,不够灵活。而使用构造函数的好处是可以通过字符串变量动态的创建正则表达式,你可以根据不同的输入或不同的环境来创建不同的正则表达式。
但缺点是需要进行字符转义:
const regexp_1 = /\d{4}/;
const regexp_2 = new RegExp('\\d{4}');
匹配一些特殊字符时则需要进行两次转义。例如我要匹配一个反斜杠字符("\")的正则表达式,由于在正则中反斜杠字符("\")是一个特殊字符,需要使用反斜杠字符本身进行转义:"\\"。然而通过字符串作为参数传入构造函数时,因为字符串中反斜杠字符("\")也是需要被转义的,所以我们需要再进行一次转义:"\\\\"。
const regexText = '\\\\';
const regex = new RegExp(regexText);
// 等价于 const regex = /\\/;
console.log(regex);
还有一点就是这两种创建正则表达式的方式在某些情况下,性能开销会有些许区别。
当你在一个会被重复执行的一个代码块中使用字面量创建一个正则表达式,且将其赋值给一个常量时,由于JavaScript文件在加载后,正则表达式的字面量就会被编译,当代码执行到该处时,便会直接引用该正则表达式字面量的编译状态。
如果是使用正则表达式的构造函数进行创建,那只有当代码执行到正则表达式创建的这个位置时,才会开始编译正则表达式,这也称之为运行时编译。
文章评论