版本

no-misleading-character-class

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

建議

設定檔中使用來自@eslint/jsrecommended設定,即可啟用此規則

💡 有建議

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

Unicode 包含由多個程式碼點組成的字元。RegExp 字元類別語法 (/[abc]/) 無法將由多個程式碼點組成的字元視為一個字元來處理;這些字元將被分解為每個程式碼點。例如,❇️ (U+2747) 和 VARIATION SELECTOR-16 (U+FE0F) 組成。如果此字元在 RegExp 字元類別中,它將匹配 (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

規則詳細資訊

此規則會報告在字元類別語法中包含多個程式碼點字元的正則表達式。

此規則的錯誤程式碼範例

在 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("[\ud83d" + "\udc4d]");

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

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

資源

變更語言