Skip to content
← Back to rules

eslint/no-misleading-character-class 正确性

This rule is turned on by default.
An auto-fix is available for this rule.

它的作用

此规则报告在字符类语法中包含多个码点字符的正则表达式。这包括:

  • 带有组合标记的字符(例如 Á,其中 A 后跟一个组合锐音符)
  • 带有表情符号修饰符的字符(例如 👶🏻
  • 区域指示符号对(例如 🇯🇵
  • 通过零宽连接符(ZWJ)连接的字符(例如 👨‍👩‍👦
  • 未使用 Unicode 标志的代理对(例如 /^[👍]$/

为什么这是不好的?

Unicode 包含由多个码点组成的字符。 正则表达式字符类语法(/[abc]/)无法将由多个码点构成的字符视为一个整体; 这些字符会被拆解为各自的码点。 例如,❇️U+2747)和变体选择符-16(U+FE0F)组成。 如果该字符出现在正则表达式字符类中, 它将匹配 U+2747)或变体选择符-16(U+FE0F),而不是完整的 ❇️

这可能导致正则表达式无法匹配作者预期的内容, 尤其对于表情符号、区域指示符号以及带组合标记的字符。

示例

以下为 错误 的代码示例:

javascript
/^[Á]$/u;
/^[❇️]$/u;
/^[👶🏻]$/u;
/^[🇯🇵]$/u;
/^[👨‍👩‍👦]$/u;
new RegExp("[🎵]");

以下为 正确 的代码示例:

javascript
/^[abc]$/;
/^[👍]$/u;
/[\u00B7\u0300-\u036F]/u;
new RegExp("^[\u{1F1EF}\u{1F1F5}]", "u");

配置

此规则接受一个配置对象,包含以下属性:

allowEscape

type: boolean

default: false

当设置为 true 时,规则允许在字符类中使用转义序列书写任意码点组合。

使用 { "allowEscape": true } 时的 错误 代码示例:

javascript
/[\uD83D]/; // 反斜杠可以省略
new RegExp("[\ud83d" + "\udc4d]");

使用 { "allowEscape": true } 时的 正确 代码示例:

javascript
/[\ud83d\udc4d]/;
/[\u00B7\u0300-\u036F]/u;
/[👨\u200d👩]/u;
new RegExp("[\x41\u0301]");
new RegExp(`[\u{1F1EF}\u{1F1F5}]`, "u");
new RegExp("[\\u{1F1EF}\\u{1F1F5}]", "u");

如何使用

要通过配置文件或 CLI 启用 此规则,可以使用:

json
{
  "rules": {
    "no-misleading-character-class": "error"
  }
}
bash
oxlint --deny no-misleading-character-class

参考资料