试一试
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
语法
new RegExp(pattern)
new RegExp(pattern, flags)
RegExp(pattern)
RegExp(pattern, flags)
参数
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(通常意味着它不是子类);flags为undefined。
在所有其他情况下,使用或不使用 new 调用 RegExp() 都会创建一个新的 RegExp 对象。如果 pattern 是一个正则表达式,新对象的 source 是 pattern.source;否则,它的 source 是 强制转换为字符串 的 pattern。如果 flags 参数不为 undefined,则新对象的 flags 为参数值;否则,它的 flags 是 pattern.flags(如果 pattern 是正则表达式)。
异常
SyntaxError-
在以下情况之一中抛出
pattern无法解析为有效的正则表达式。flags包含重复字符或任何不允许的字符。
示例
字面量表示法和构造函数
创建 RegExp 对象有两种方法:字面量表示法 和构造函数。
- 字面量表示法采用两个斜杠之间的模式,后跟可选的标志,在第二个斜杠之后。
- 构造函数将字符串或
RegExp对象作为其第一个参数,并将可选标志的字符串作为第二个参数。
以下三个表达式创建了相同的正则表达式
/ab+c/i;
new RegExp(/ab+c/, "i"); // literal notation
new RegExp("ab+c", "i"); // constructor
在使用正则表达式之前,它们必须经过编译。此过程允许它们更有效地执行匹配。有两种方法可以编译并获取 RegExp 对象。
字面量表示法在表达式求值时编译正则表达式。另一方面,RegExp 对象的构造函数 new RegExp('ab+c') 会在运行时编译正则表达式。
当您想 从动态输入构建正则表达式 时,请使用字符串作为 RegExp() 构造函数的第一个参数。
从动态输入构建正则表达式
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 |
浏览器兼容性
加载中…