JavaScriptの正規表現で半角カタカナを扱う時、\xA1-\xDF と書くと、期待した半角カタカナの範囲にはなりません。
一言でいうと
JavaScript正規表現の \xA1-\xDF はU+00A1〜U+00DFを指し、半角カタカナのU+FF61〜U+FF9Fとは別の範囲です。
よくある誤り
const wrong = /[\xA1-\xDF]/;
console.log(wrong.test("ア")); // false
このパターンは、半角カタカナの ア を対象にしていません。
正しい範囲
半角カタカナをUnicode範囲で指定する場合は、U+FF61〜U+FF9Fを使います。
const halfwidthKatakana = /[\uFF61-\uFF9F]/;
console.log(halfwidthKatakana.test("ア")); // true
console.log(halfwidthKatakana.test("ア")); // false
ア は全角カタカナで、U+30A2です。ア は半角カタカナで、U+FF71です。
なぜ間違えやすいのか
古い文字コードやShift_JISの知識と、Unicodeの範囲指定が混ざると混乱します。
| 表記 | JavaScript正規表現での意味 |
|---|---|
\xA1 | U+00A1 |
\xDF | U+00DF |
\uFF61 | U+FF61 |
\uFF9F | U+FF9F |
JavaScriptの文字列と正規表現はUnicodeを前提に考える必要があります。
全角・半角判定の例
ASCII印字可能文字と半角カタカナを半角扱いにする例です。
const halfwidthPattern = /^[\x20-\x7E\uFF61-\uFF9F]+$/;
console.log(halfwidthPattern.test("ABC123")); // true
console.log(halfwidthPattern.test("アイウ")); // true
console.log(halfwidthPattern.test("アイウ")); // false
この場合、半角として許可する範囲を明示しています。
否定で書く時の注意
「半角以外を含むか」を見るなら、否定文字クラスを使えます。
const hasNonHalfwidth = /[^\x20-\x7E\uFF61-\uFF9F]/;
console.log(hasNonHalfwidth.test("ABCアイ")); // false
console.log(hasNonHalfwidth.test("ABCアイ")); // true
ただし、何を半角扱いするかは用途に合わせて決めます。
入力チェックでは「全角かどうか」より先に「許可する文字範囲」を決めます。
よくある誤解
| 誤解 | 実際 |
|---|---|
\xA1-\xDF は半角カタカナ | JavaScriptではU+00A1〜U+00DFです |
| 半角カタカナはASCIIの近くにある | UnicodeではU+FF61〜U+FF9Fです |
| 全角判定は1つの正規表現で万能 | 用途ごとに定義が必要です |
u フラグを付ければ範囲ミスが直る | 範囲指定そのものが違えば直りません |
まとめ
JavaScript正規表現で半角カタカナを判定するなら、\uFF61-\uFF9F を使います。\xA1-\xDF はU+00A1〜U+00DFであり、半角カタカナとは別のUnicode範囲です。