正規表現とは何か
正規表現は「文字列の集合」を記述するパターンです。入力に対して正規表現を実行すると、エンジンは「このパターンにマッチする部分文字列はあるか、あるならどこか」を判定します。この問いひとつが、検索・検証・分割・置換のすべてを支えます。パターン自体はリテラル・演算子・グループからなる小さな言語であり、ブロックが揃えば残りは組み合わせです。
リテラルとエスケープ
正規表現の中の多くの文字は自分自身にマッチします。「cat」は入力中の「cat」にマッチします。ただし一部の文字には特別な意味があり、リテラルとして使うにはバックスラッシュでエスケープが必要です: . * + ? ( ) [ ] { } | ^ $ \。たとえば「3\.14」は文字列「3.14」にマッチしますが、「3.14」は「3」+任意の 1 文字+「14」(ドットはメタ文字)にマッチします。
文字クラス
- [abc] — a、b、c のいずれか 1 文字。
- [a-z] — 小文字の英字のいずれか(範囲指定)。
- [^0-9] — 数字以外(先頭の ^ で否定)。
- \d — 任意の数字、[0-9] と同等。
- \w — ワード文字: 英字・数字・アンダースコア。
- \s — 空白文字: スペース・タブ・改行。
- . — 改行以外の任意の 1 文字(s フラグで改行も含める)。
量指定子
- * — 直前要素が 0 回以上。
- + — 直前要素が 1 回以上。
- ? — 直前要素が 0 回または 1 回(オプション化)。
- {3} — 厳密に 3 回。
- {3,} — 3 回以上。
- {3,5} — 3 〜 5 回。
- デフォルトでは量指定子は「貪欲」で、できるだけ多くマッチします。量指定子の後ろに ? を付けると「最短一致」になります(.*? は最小限のマッチ)。
アンカー
アンカーは文字ではなく「位置」にマッチします。「^」は文字列の先頭(m フラグなら各行の先頭)、「$」は文字列の末尾(m フラグなら各行の末尾)です。「\b」はワード境界、つまりワード文字と非ワード文字の境目にマッチします。たとえば「^hello」は先頭の「hello」のみ、「\bcat\b」は単語としての「cat」にマッチし、「category」や「concatenate」の中の「cat」にはマッチしません。
グループと交替
括弧「(...)」はパターンの一部をグループ化し、量指定子や交替をグループ全体に適用します。同時にマッチした文字列をキャプチャして後で参照できるようにします。「(cat|dog)」は「cat」または「dog」にマッチします。「gr(a|e)y」は「gray」または「grey」にマッチします。キャプチャ不要のグループは「(?:...)」を使うと、性能向上とキャプチャインデックスの整理に役立ちます。
フラグ
- i — 大文字小文字を無視: /hello/i は「Hello」「HELLO」などにもマッチ。
- g — グローバル: 最初の 1 件ではなく、すべての一致を検出。
- m — マルチライン: ^ と $ が各行の先頭・末尾にマッチ。
- s — dotall: . が改行にもマッチ。
- u — Unicode: 完全な Unicode 対応(非 ASCII 入力では必須)。
よく使う実用パターン
- 先頭・末尾の空白除去: ^\s+|\s+$
- 整数(負数も): -?\d+
- 小数: -?\d+(?:\.\d+)?
- ゆるいメール判定(厳密な検証はライブラリを使う): \S+@\S+\.\S+
- URL: https?://\S+
- 16 進カラー: #(?:[0-9a-f]{3}|[0-9a-f]{6})\b
- ISO 8601 日付: \d{4}-\d{2}-\d{2}
正規表現が向かない用途
ネストする構造(HTML・XML・プログラミング言語)のパースには正規表現は不適切です。それらは平坦なパターンで表現できないルールを持ちます。RFC 5322 に厳密準拠するメールアドレス検証はパーサが必要で、正規表現では不可能です。URL パース・ファイルパス処理・JSON は各言語の専用ライブラリを使ってください。正規表現は、文法が「正規」であるテキストでのパターンマッチングに使うのが本筋です。
段階的にテスト・デバッグする
経験豊富なエンジニアでも正規表現は段階的に書きます。パターンの特徴的な部分から始め、マッチするはずの例・マッチしないはずの例で検証し、境界条件やエッジケースを加えていきます。本サイトの正規表現テスター(ブラウザ内で動作)のように即座にフィードバックを得られるツールを使うと、プログラム全体を実行して試行錯誤するより遥かに効率的です。