no-misleading-character-class
禁止在字元類別語法中使用由多個碼點組成的字元
Unicode 包含由多個碼點組成的字元。正規表示式字元類別語法 (/[abc]/
) 無法將由多個碼點組成的字元當作一個字元處理;這些字元將會被分解為每個碼點。例如,❇️
是由 ❇
(U+2747
) 和 VARIATION SELECTOR-16 (U+FE0F
) 組成。如果這個字元在正規表示式字元類別中,它將會比對 ❇
(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
規則詳細資訊
此規則會報告在字元類別語法中包含多個碼點字元的正規表示式。
此規則的不正確程式碼範例
在遊樂場中開啟
/*eslint no-misleading-character-class: error */
/^[]$/u;
/^[]$/u;
/^[]$/u;
/^[]$/u;
/^[]$/u;
/^[]$/;
new RegExp("[]");
此規則的正確程式碼範例
在遊樂場中開啟
/*eslint no-misleading-character-class: error */
/^[abc]$/;
/^[👍]$/u;
/^[\q{👶🏻}]$/v;
new RegExp("^[]$");
new RegExp(`[Á-${z}]`, "u"); // variable pattern
選項
此規則有一個物件選項
"allowEscape"
:當設定為true
時,此規則允許字元類別內的任何碼點群組,只要它們是使用跳脫序列寫入的。此選項僅對正規表示式字面值和以字面值參數建立的RegExp
建構函式所建立的正規表示式有效。
allowEscape
啟用 { "allowEscape": true }
選項時,此規則的不正確程式碼範例
在遊樂場中開啟
/* eslint no-misleading-character-class: ["error", { "allowEscape": true }] */
/[]/; // backslash can be omitted
new RegExp();
const pattern = "[\ud83d\udc4d]";
new RegExp();
啟用 { "allowEscape": true }
選項時,此規則的正確程式碼範例
在遊樂場中開啟
/* 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");
何時不該使用
如果您不想檢查正規表示式字元類別語法中是否有多個碼點字元,可以關閉此規則。
版本
此規則在 ESLint v5.3.0 中引入。