no-misleading-character-class
禁止在字元類別語法中使用由多個程式碼點組成的字元
Unicode 包含由多個程式碼點組成的字元。RegExp 字元類別語法 (/[abc]/
) 無法將由多個程式碼點組成的字元視為一個字元來處理;這些字元將被分解為每個程式碼點。例如,❇️
由 ❇
(U+2747
) 和 VARIATION SELECTOR-16 (U+FE0F
) 組成。如果此字元在 RegExp 字元類別中,它將匹配 ❇
(U+2747
) 或 VARIATION SELECTOR-16 (U+FE0F
),而不是 ❇️
。
此規則會報告在字元類別語法中包含多個程式碼點字元的正則表達式。此規則將以下字元視為多個程式碼點字元。
帶有組合字元的字元
組合字元是屬於 Mc
、Me
和 Mn
Unicode 通用類別之一的字元。
/^[Á]$/u.test("Á"); //→ false
/^[❇️]$/u.test("❇️"); //→ false
帶有 Emoji 修飾符的字元
/^[👶🏻]$/u.test("👶🏻"); //→ false
/^[👶🏽]$/u.test("👶🏽"); //→ false
一對區域指示符號
/^[🇯🇵]$/u.test("🇯🇵"); //→ false
ZWJ 連接的字元
/^[👨👩👦]$/u.test("👨👩👦"); //→ false
不帶 Unicode 標誌的代理對
/^[👍]$/.test("👍"); //→ false
// Surrogate pair is OK if with u flag.
/^[👍]$/u.test("👍"); //→ true
規則詳細資訊
此規則會報告在字元類別語法中包含多個程式碼點字元的正則表達式。
此規則的錯誤程式碼範例
在 Playground 中開啟
/*eslint no-misleading-character-class: error */
/^[]$/u;
/^[]$/u;
/^[]$/u;
/^[]$/u;
/^[]$/u;
/^[]$/;
new RegExp("[]");
此規則的正確程式碼範例
在 Playground 中開啟
/*eslint no-misleading-character-class: error */
/^[abc]$/;
/^[👍]$/u;
/^[\q{👶🏻}]$/v;
new RegExp("^[]$");
new RegExp(`[Á-${z}]`, "u"); // variable pattern
選項
此規則有一個物件選項
"allowEscape"
:當設定為true
時,此規則允許字元類別內部的任何程式碼點分組,只要它們是使用跳脫序列編寫的即可。此選項僅對正則表達式字面值以及使用字面值參數作為模式建立的RegExp
建構函式有效。
allowEscape
使用 { "allowEscape": true }
選項時,此規則的錯誤程式碼範例
在 Playground 中開啟
/* eslint no-misleading-character-class: ["error", { "allowEscape": true }] */
/[]/; // backslash can be omitted
new RegExp();
const pattern = "[\ud83d\udc4d]";
new RegExp();
使用 { "allowEscape": true }
選項時,此規則的正確程式碼範例
在 Playground 中開啟
/* eslint no-misleading-character-class: ["error", { "allowEscape": true }] */
/[\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");
何時不應使用
如果您不想檢查 RegExp 字元類別語法中的多個程式碼點字元,則可以關閉此規則。
版本
此規則在 ESLint v5.3.0 中引入。