正規表現文字クラス

[a-z], \d, \w などの文字集合を指定する構文。マッチさせたい文字の範囲を定義する。

正規表現文字クラス (Character Class) は、マッチさせたい文字の集合を定義する構文です。角括弧 [] 内に文字や範囲を記述するカスタムクラスと、\d\w などの定義済みクラスの 2 種類があります。正規表現の基本構成要素として、ほぼすべてのパターンで使用されます。

カスタム文字クラスでは、[a-z] で小文字のアルファベット、[0-9] で数字、[a-zA-Z0-9] で英数字にマッチします。先頭に ^ を置くと否定クラスになり、[^abc] は a, b, c 以外の任意の文字にマッチします。範囲指定はハイフン - で行い、[A-F0-9] のように 16 進数の文字セットも簡潔に表現できます。

定義済みクラスは頻出する文字集合のショートカットです。\d は数字 ([0-9] と同等)、\w は単語文字 ([a-zA-Z0-9_])、\s は空白文字 (スペース、タブ、改行など) にマッチします。大文字にすると否定になり、\D は数字以外、\W は単語文字以外にマッチします。

定義済みクラスがどこまでを含むかは処理系によって変わるため、言語をまたぐときは必ず確認します。JavaScript の \du フラグを付けても半角の [0-9] だけで、全角の「1」にはマッチしません。一方 Python 3 の \d は全角の「1」にもマッチし、\w は「漢」のような日本語の文字までマッチします。半角英数字だけを対象にしたいなら Python では re.ASCII フラグを付けるか、[0-9] のように範囲を明示して書くのが安全です。

Unicode 対応の正規表現では、\p{Script=Hiragana} のように Unicode プロパティエスケープを使って特定のスクリプトやカテゴリの文字にマッチさせることができます。JavaScript では ES2018 から u フラグと組み合わせて利用可能です。日本語テキストの処理では \p{Script=Han} (漢字)、\p{Script=Katakana} (カタカナ) などが有用です。ES2024 で追加された v フラグを使うと [\w--_] (単語構成文字からアンダースコアを除く) のように差集合を書けるため、複数の条件を組み合わせた文字集合を素直に表現できます。

文字クラス内ではメタ文字の多くがリテラルとして扱われますが、] (クラスの終了)、\ (エスケープ)、^ (先頭での否定)、- (範囲指定) は特別な意味を持つため注意が必要です。これらをリテラルとしてマッチさせるにはエスケープするか、特別な意味を持たない位置に配置します。

文字数カウントとの関連では、文字クラスを使って特定の種類の文字だけを数えることができます。たとえば \p{Script=Han} で漢字の数、\d で数字の数を個別にカウントでき、テキストの構成分析に役立ちます。

この記事を共有