版本

prefer-regex-literals

禁止使用 RegExp 构造函数,推荐使用正则表达式字面量

💡 hasSuggestions

此规则报告的一些问题可以通过编辑器 建议 手动修复

有两种方法可以创建正则表达式

  • 正则表达式字面量,例如,/abc/u
  • RegExp 构造函数,例如,new RegExp("abc", "u")RegExp("abc", "u")

当您想要动态生成模式时,构造函数特别有用,因为它接受字符串参数。

当将构造函数与字符串字面量一起使用时,请不要忘记字符串转义规则仍然适用。 如果你想在模式中放置一个反斜杠,你需要在字符串字面量中转义它。 因此,以下是等效的

new RegExp("^\\d\\.$");

/^\d\.$/;

// matches "0.", "1.", "2." ... "9."

在上面的例子中,正则表达式字面量更容易阅读和理解。 此外,在字符串字面量中省略额外的 \ 是一个常见的错误,这会产生一个完全不同的正则表达式

new RegExp("^\d\.$");

// equivalent to /^d.$/, matches "d1", "d2", "da", "db" ...

当正则表达式是预先知道的时,最佳实践是避免在正则表达式表示法之上使用字符串字面量表示法,并使用正则表达式字面量而不是构造函数。

规则详情

此规则禁止使用 RegExp 构造函数,并使用字符串字面量作为其参数。

此规则还禁止将 RegExp 构造函数与不带表达式的模板字面量和不带表达式的 String.raw 标记模板字面量一起使用。

该规则并非禁止所有 RegExp 构造函数的使用。 它仍然应该用于动态生成的正则表达式。

此规则的 错误 代码示例

在 Playground 中打开
/*eslint prefer-regex-literals: "error"*/

new RegExp("abc");

new RegExp("abc", "u");

RegExp("abc");

RegExp("abc", "u");

new RegExp("\\d\\d\\.\\d\\d\\.\\d\\d\\d\\d");

RegExp(`^\\d\\.$`);

new RegExp(String.raw`^\d\.$`);

此规则的 正确 代码示例

在 Playground 中打开
/*eslint prefer-regex-literals: "error"*/

/abc/;

/abc/u;

/\d\d\.\d\d\.\d\d\d\d/;

/^\d\.$/;

// RegExp constructor is allowed for dynamically generated regular expressions

new RegExp(pattern);

RegExp("abc", flags);

new RegExp(prefix + "abc");

RegExp(`${prefix}abc`);

new RegExp(String.raw`^\d\. ${suffix}`);

选项

此规则有一个对象选项

  • disallowRedundantWrapping 设置为 true 会额外检查不必要地包装的正则表达式字面量(默认为 false)。

disallowRedundantWrapping

默认情况下,当正则表达式字面量不必要地包装在 RegExp 构造函数调用中时,此规则不会检查。 当选项 disallowRedundantWrapping 设置为 true 时,该规则还将禁止此类不必要的模式。

{ "disallowRedundantWrapping": true }错误 代码示例

在 Playground 中打开
/*eslint prefer-regex-literals: ["error", {"disallowRedundantWrapping": true}]*/

new RegExp(/abc/);

new RegExp(/abc/, 'u');

{ "disallowRedundantWrapping": true }正确 代码示例

在 Playground 中打开
/*eslint prefer-regex-literals: ["error", {"disallowRedundantWrapping": true}]*/

/abc/;

/abc/u;

new RegExp(/abc/, flags);

版本

此规则在 ESLint v6.4.0 中引入。

延伸阅读

资源

更改语言