版本

no-misleading-character-class

禁止在字元類別語法中使用由多個碼點組成的字元

建議使用

設定檔中使用 @eslint/jsrecommended 設定檔,會啟用此規則

💡 有建議

此規則報告的一些問題可以透過編輯器建議手動修正

Unicode 包含由多個碼點組成的字元。正規表示式字元類別語法 (/[abc]/) 無法將由多個碼點組成的字元當作一個字元處理;這些字元將會被分解為每個碼點。例如,❇️ 是由 (U+2747) 和 VARIATION SELECTOR-16 (U+FE0F) 組成。如果這個字元在正規表示式字元類別中,它將會比對 (U+2747) 或 VARIATION SELECTOR-16 (U+FE0F),而不是 ❇️

此規則會報告在字元類別語法中包含多個碼點字元的正規表示式。此規則會將下列字元視為多個碼點字元。

含有組合字元的字元

組合字元是屬於 McMeMn 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("[\ud83d" + "\udc4d]");

const pattern = "[\ud83d\udc4d]";
new RegExp(pattern);

啟用 { "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 中引入。

資源

變更語言