RegExp() 构造函数

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

RegExp() 构造函数用于创建 RegExp 对象。

有关正则表达式的介绍,请阅读 JavaScript 指南 中的 正则表达式章节

试一试

const regex1 = /\w+/;
const regex2 = new RegExp("\\w+");

console.log(regex1);
// Expected output: /\w+/

console.log(regex2);
// Expected output: /\w+/

console.log(regex1 === regex2);
// Expected output: false

语法

js
new RegExp(pattern)
new RegExp(pattern, flags)
RegExp(pattern)
RegExp(pattern, flags)

注意: RegExp() 可以使用或不使用 new 调用,但有时效果不同。请参阅 返回值

参数

pattern

正则表达式的文本。也可以是另一个 RegExp 对象。

flags 可选

如果指定了 flags,它是一个包含要添加的标志的字符串。或者,如果为 pattern 提供了 RegExp 对象,则 flags 字符串将替换该对象的所有标志(并且 lastIndex 将重置为 0)。

flags 可以包含以下字符的任意组合

d (indices)

为子字符串匹配生成索引。

g (global)

查找所有匹配项,而不是在第一个匹配项后停止。

i (ignore case)

匹配时忽略大小写差异。

m (multiline)

将开头和结尾断言(^$)视为作用于多行。换句话说,匹配每行(由 \n\r 分隔)的开头或结尾,而不仅仅是整个输入字符串的开头或结尾。

s (dotAll)

允许 . 匹配换行符。

u (unicode)

pattern 视为 Unicode 代码点序列。

v (unicodeSets)

u 标志的升级版,它在字符类以及字符串属性中启用了集合表示法。

y (sticky)

仅从目标字符串中该正则表达式的 lastIndex 属性指示的索引开始匹配。不尝试从任何更晚的索引进行匹配。

返回值

RegExp(pattern) 在以下所有条件都满足时直接返回 pattern

  • RegExp() 是在没有 new 的情况下调用的;
  • pattern 是一个正则表达式;
  • pattern.constructor === RegExp(通常意味着它不是子类);
  • flagsundefined

在所有其他情况下,使用或不使用 new 调用 RegExp() 都会创建一个新的 RegExp 对象。如果 pattern 是一个正则表达式,新对象的 sourcepattern.source;否则,它的 source 是 强制转换为字符串pattern。如果 flags 参数不为 undefined,则新对象的 flags 为参数值;否则,它的 flagspattern.flags(如果 pattern 是正则表达式)。

异常

SyntaxError

在以下情况之一中抛出

  • pattern 无法解析为有效的正则表达式。
  • flags 包含重复字符或任何不允许的字符。

示例

字面量表示法和构造函数

创建 RegExp 对象有两种方法:字面量表示法构造函数

  • 字面量表示法采用两个斜杠之间的模式,后跟可选的标志,在第二个斜杠之后。
  • 构造函数将字符串或 RegExp 对象作为其第一个参数,并将可选标志的字符串作为第二个参数。

以下三个表达式创建了相同的正则表达式

js
/ab+c/i;
new RegExp(/ab+c/, "i"); // literal notation
new RegExp("ab+c", "i"); // constructor

在使用正则表达式之前,它们必须经过编译。此过程允许它们更有效地执行匹配。有两种方法可以编译并获取 RegExp 对象。

字面量表示法在表达式求值时编译正则表达式。另一方面,RegExp 对象的构造函数 new RegExp('ab+c') 会在运行时编译正则表达式。

当您想 从动态输入构建正则表达式 时,请使用字符串作为 RegExp() 构造函数的第一个参数。

从动态输入构建正则表达式

js
const breakfasts = ["bacon", "eggs", "oatmeal", "toast", "cereal"];
const order = "Let me get some bacon and eggs, please";

order.match(new RegExp(`\\b(${breakfasts.join("|")})\\b`, "g"));
// Returns ['bacon', 'eggs']

规范

规范
ECMAScript® 2026 语言规范
# sec-regexp-constructor

浏览器兼容性

另见