eslint/no-misleading-character-class 正しさ
何を行うか
このルールは、文字クラス構文内に複数のコードポイントからなる文字が含まれている正規表現を報告します。以下が該当します:
- 結合マークを持つ文字(例:
Áでは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