正規表現(RegExp)とは
正規表現(Regular Expression、略称 RegExp / regex)とは、文字列の中から特定のパターンに一致する部分を検索・抽出・置換するための表記法です。1950年代に数学者スティーヴン・クリーネによって理論的な基礎が築かれ、その後UNIXのテキスト処理ツール(grep、sed、awk)に実装されたことで、プログラミングの世界に広く普及しました。現在ではJavaScript、Python、Java、PHP、Rubyなど、ほぼすべての主要なプログラミング言語が正規表現をサポートしており、テキスト処理における必須スキルのひとつとされています。正規表現を使えば、単純な文字列検索では実現できない柔軟なパターンマッチングが可能になり、入力値のバリデーション、ログファイルの解析、データのクレンジングなど、幅広い場面で活用されています。
基本的な構文と特殊文字
正規表現の構文は、通常の文字(リテラル)と特殊な意味を持つメタ文字の組み合わせで構成されます。最も基本的なメタ文字を理解することが、正規表現を使いこなすための第一歩です。ドット(.)は改行を除く任意の1文字にマッチし、アスタリスク(*)は直前の要素の0回以上の繰り返し、プラス(+)は1回以上の繰り返し、クエスチョンマーク(?)は0回または1回の出現を表します。角括弧([])で囲んだ文字クラスは、その中のいずれか1文字にマッチします。たとえば [a-z] は小文字のアルファベット1文字、[0-9] は数字1文字に対応します。丸括弧(())はグループ化に使われ、マッチした部分文字列をキャプチャして後から参照できます。パイプ記号(|)は「または」を意味し、複数の選択肢を指定できます。キャレット(^)は行頭、ドル記号($)は行末へのアンカーとして機能します。
文字クラスとショートカット
正規表現には、よく使うパターンを短く書くためのショートカットが用意されています。\d は数字([0-9]と同等)、\w は英数字とアンダースコア([a-zA-Z0-9_]と同等)、\s は空白文字(スペース、タブ、改行など)にそれぞれマッチします。これらの大文字版(\D, \W, \S)は、その否定を表します。たとえば \D は数字以外の任意の文字にマッチします。文字クラスの中ではハイフンを使って範囲を指定でき、[A-Za-z] で全英字、[ぁ-ん] でひらがなを表現できます。
量指定子(Quantifier)
量指定子は、パターンの繰り返し回数を指定するための記法です。{n} はちょうどn回、{n,} はn回以上、{n,m} はn回以上m回以下の繰り返しを意味します。たとえば \d{3} は3桁の数字、[A-Z]{2,5} は2文字以上5文字以下の大文字アルファベットにマッチします。デフォルトでは量指定子は「貪欲(greedy)」に動作し、可能な限り長い文字列にマッチしようとします。量指定子の後に?を付ける(例: *?、+?)と「非貪欲(lazy)」モードになり、最短一致でマッチします。
日本語テキスト処理での活用
日本語のテキスト処理では、ひらがな・カタカナ・漢字をそれぞれ区別して抽出したい場面が頻繁にあります。Unicodeの文字範囲を利用すれば、正規表現でこれらを識別できます。ひらがなは [\u3040-\u309F]、カタカナは [\u30A0-\u30FF]、漢字(CJK統合漢字)は [\u4E00-\u9FFF] の範囲で指定します。たとえば、テキストから漢字のみを抽出したい場合は [\u4E00-\u9FFF]+ というパターンを使います。また、全角数字 [\uFF10-\uFF19] や全角英字 [\uFF21-\uFF3A\uFF41-\uFF5A] の検出にも正規表現が活躍します。日本語の郵便番号(例: 123-4567)を検出するには \d{3}-\d{4} というパターンが使えますし、日本の電話番号パターンも正規表現で柔軟に記述できます。
実践的な使用例
フォーム入力のバリデーション
Webアプリケーションの開発では、ユーザーが入力したデータの形式を検証するために正規表現が多用されます。メールアドレスの形式チェック、電話番号の桁数確認、パスワードの強度検証(英字・数字・記号の混在チェック)など、正規表現を使えば複雑な条件を簡潔に記述できます。ただし、メールアドレスのような複雑な仕様を完全に検証するには、正規表現だけでは不十分な場合もあるため、基本的な形式チェックとして使い、厳密な検証はサーバーサイドで行うことが推奨されます。
ログ解析とデータ抽出
サーバーのアクセスログやアプリケーションログから、特定のパターン(IPアドレス、タイムスタンプ、エラーコードなど)を抽出する際にも正規表現は欠かせません。大量のログデータの中から必要な情報だけを効率よく取り出すことで、障害の原因調査やアクセス分析を迅速に行えます。