概要
このチートシートでは、JavaScriptの正規表現でUnicode文字を扱う時によく使う範囲指定をまとめます。
JavaScript正規表現では、半角カタカナは \xA1-\xDF ではなく \uFF61-\uFF9F で指定します。
最初に覚える最小セット
| 目的 | パターン |
|---|---|
| ASCII印字可能文字 | [\x20-\x7E] |
| ひらがな | [\u3040-\u309F] |
| カタカナ | [\u30A0-\u30FF] |
| 半角カタカナ | [\uFF61-\uFF9F] |
| CJK統合漢字の一部 | [\u4E00-\u9FFF] |
| ASCII + 半角カタカナ | [\x20-\x7E\uFF61-\uFF9F] |
ASCII
| 範囲 | 意味 |
|---|---|
\x00-\x7F | ASCII全体 |
\x20-\x7E | 印字可能なASCII |
A-Z | 半角大文字英字 |
a-z | 半角小文字英字 |
0-9 | 半角数字 |
const printableAscii = /^[\x20-\x7E]+$/;
日本語の代表的な範囲
| 文字種 | パターン |
|---|---|
| ひらがな | [\u3040-\u309F] |
| カタカナ | [\u30A0-\u30FF] |
| 半角カタカナ | [\uFF61-\uFF9F] |
| 漢字の代表範囲 | [\u4E00-\u9FFF] |
const japaneseBasic = /[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]/;
漢字は範囲が広く、すべてを単純な1範囲で扱い切れるわけではありません。厳密な処理ではUnicode仕様やライブラリを確認します。
半角扱いの例
ASCII印字可能文字と半角カタカナだけを許可する例です。
const halfwidthOnly = /^[\x20-\x7E\uFF61-\uFF9F]+$/;
console.log(halfwidthOnly.test("ABC123")); // true
console.log(halfwidthOnly.test("アイウ")); // true
console.log(halfwidthOnly.test("アイウ")); // false
半角以外を含むかを見る場合:
const hasNonHalfwidth = /[^\x20-\x7E\uFF61-\uFF9F]/;
Unicodeプロパティエスケープ
JavaScriptでは、u フラグとUnicodeプロパティエスケープを使える環境があります。
| 目的 | パターン |
|---|---|
| 文字全般 | \p{Letter} |
| 数字 | \p{Number} |
| ひらがな | \p{Script=Hiragana} |
| カタカナ | \p{Script=Katakana} |
| 漢字 | \p{Script=Han} |
const hasHiragana = /\p{Script=Hiragana}/u;
console.log(hasHiragana.test("こんにちは")); // true
Unicodeプロパティエスケープを使う時は、原則として u フラグを付けます。
よくある間違い
| 間違い | 理由 |
|---|---|
[\xA1-\xDF] を半角カタカナとして使う | JavaScriptではU+00A1〜U+00DFです |
[^\\x01-\\x7E] を万能な全角判定にする | 半角カタカナや制御文字の扱いが曖昧です |
漢字を \u4E00-\u9FAF だけで済ませる | 漢字範囲はより広いです |
u フラグなしで高度なUnicode処理をする | サロゲートペアで崩れる場合があります |
まとめ
JavaScript正規表現でUnicodeを扱う時は、ASCII、ひらがな、カタカナ、半角カタカナの範囲を分けて指定します。半角カタカナは \uFF61-\uFF9F、Unicodeプロパティエスケープには u フラグを使います。