eslint/no-misleading-character-class 正确性
它的作用
此规则报告在字符类语法中包含多个码点字符的正则表达式。这包括:
- 带有组合标记的字符(例如
Á,其中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