Skip to content
← Back to rules

eslint/no-misleading-character-class 正しさ

This rule is turned on by default.
An auto-fix is available for this rule.

何を行うか

このルールは、文字クラス構文内に複数のコードポイントからなる文字が含まれている正規表現を報告します。以下が該当します:

  • 結合マークを持つ文字(例:Á では A の後に結合アクセントが続く)
  • エンジョイモディファイアを持つ文字(例:👶🏻
  • 地域識別子シンボルのペア(例:🇯🇵
  • 零幅結合子(ZWJ)で連結された文字(例:👨‍👩‍👦
  • ユニコードフラグなしのサロゲートペア(例:/^[👍]$/

なぜ問題なのか

ユニコードには複数のコードポイントから構成される文字が含まれています。 正規表現の文字クラス構文(/[abc]/)は、複数のコードポイントからなる文字を1つの文字として扱うことができません; これらの文字は個々のコードポイントに分解されてしまいます。 例えば、❇️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

参照