字面量
, 构造函数
和工厂符号
都是可以的:
// 字面量
/pattern/flags
// 构造函数
new RegExp(pattern [, flags])
// 工厂符号
RegExp(pattern [, flags])
正则表达式的文本。
如果指定,标志可以具有以下值的任意组合:
名称 | 具体说明 |
---|---|
g | 全局匹配;找到所有匹配,而不是在第一个匹配后停止 |
i | 忽略大小写 |
m | 多行; 将开始和结束字符(^ 和$ )视为在多行上工作(也就是,分别匹配每一行的开始和结束(由 \n 或 \r 分割),而不只是只匹配整个输入字符串的最开始和最末尾处。 |
u | Unicode; 将模式视为Unicode 序列点的序列 |
y | 粘性匹配; 仅匹配目标字符串中此正则表达式 的lastIndex 属性指示的索引(并且不尝试从任何后续 的索引 匹配)。 |
有两种方法来创建一个RegExp
对象:一是字面量
、二是构造函数
。
如果pattern
为字符串
或者字面量
构成,参数不需要使用引号
,而构造函数
的参数
使用引号
。
因此,以下表达式
创建相同的正则表达式
:
// 字面量
/ab+c/i;
// 构造函数
new RegExp('ab+c', 'i');
// 工厂符号
new RegExp(/ab+c/, 'i');
当表达式
被赋值
时,字面量
形式提供正则表达式
的编译(compilation
)状态,当正则表达式
保持为常量
时使用字面量
。
例如当你在循环
中使用字面量
构造一个正则表达式
时,正则表达式
不会在每一次迭代
中都被重新编译
(recompiled
)。
而正则表达式对象的构造函数,如 new RegExp('ab+c')
提供了正则表达式
运行时编译(runtime compilation
)。
如果你知道正则表达式
模式将会改变,或者你事先不知道什么模式
,而是从另一个来源
获取,如用户输入,这些情况都可以使用构造函数
。
当使用构造函数
创造正则对象
时,需要常规
的字符转义
规则(在前面加反斜杠 \
)。比如,以下是等价的:
new RegExp("\\w+");
/\w+/;
在ES5
中, 当第一个pattern
为正则对象
,不允许此时使用第二个参数
添加修饰符
,否则会报错TypeError(Uncaught TypeError: Cannot supply flags when constructing one RegExp from another)
的异常。
const regex = new RegExp(/xyz/, 'i');
// Uncaught TypeError: Cannot supply flags when constructing one RegExp from another
// 当从其他正则表达式进行构造时不支持标志
ES6
改变了这种行为。如果RegExp
构造函数第一个pattern
为正则对象
,那么可以使用第二个参数
指定修饰符
。
而且,返回的正则表达式
会忽略原有的正则表达式
的修饰符
,只使用新指定的修饰符
。
new RegExp(/abc/ig, 'i').flags
// "i"
上面代码中,原有正则对象的修饰符是ig
,它会被第二个参数i
覆盖。