SyntaxError: character class escape cannot be used in class range in regular expression
JavaScript の例外 "character class escape cannot be used in class range in regular expression" は、Unicode 対応 の正規表現パターンに含まれている場合 文字クラス を含み、かつその文字範囲の境界が文字クラスエスケープなどの別の文字クラスである場合に発生します。
エラーメッセージ
SyntaxError: Invalid regular expression: /[\s-1]/u: Invalid character class (V8-based) SyntaxError: character class escape cannot be used in class range in regular expression (Firefox) SyntaxError: Invalid regular expression: invalid range in character class for Unicode pattern (Safari)
エラー型
SyntaxError
エラーの原因
文字クラスでは、2 つの文字の間にハイフン (-) を挿入することで、文字の範囲を指定できます。例えば、[a-z] は a から z までの小文字のいずれかに一致します。範囲が意味をなすためには、範囲の両端の文字が単一の文字でなければなりません。境界のどちらかが実際には複数の文字を表している場合、エラーが発生します。v モードでない場合の文字クラスでは、文字クラスの中では(訳注:リテラル文字に加えて)文字クラスエスケープのみが利用できます。v モードの文字クラス では、範囲の境界のどちらかが別の [...] 文字クラスである場合にもエラーになります。
Unicode 非対応モードでは、この構文を使用すると、エラーが発生する代わりに - がリテラル文字として扱われますが、これは非推奨の構文であるため、これに頼らないでください。
例
>無効なケース
js
/[\s-_]/u; // \s はホワイトスペースの文字クラスエスケープ
/[A-\D]/u; // \D は数字以外の文字クラスエスケープ
/[\p{L}-\p{N}]/u; // \p{L} は Unicode 文字の文字クラスエスケープ
/[[A-z]-_]/v; // unicodeSets モードでは、文字クラスを入れ子にできる
有効なケース
js
// ハイフンを文字クラスの先頭に挿入すると、
// リテラル文字と一致する
/[-\s_]/u;
// ハイフンをエスケープすると、リテラル文字と一致する
/[\s\-_]/u;
// バックスラッシュを削除すると、境界はリテラル文字になる
/[A-D]/u;
// ハイフンを削除すると、2 つの範囲が 2 つの選択肢を表す
/[\p{L}\p{N}]/u;
// unicodeSets モードでは、-- を使用すると集合の差を表す
/[[A-z]--_]/v;