正規表現の基礎

更新日:

正規表現は、開発者・分析者にとって最も投資対効果の高いツールのひとつです。30 文字の正規表現が、命令的な数十行のコードを置き換えたり、ユーザー入力を検証したり、ログからパターンを抽出したり、ファイル名を一括書き換えしたりできます。一方で「読みづらい」ことでも有名です。本ガイドでは、リテラル・文字クラス・量指定子・アンカー・グループ・フラグといった実用要素を積み重ね、出会う正規表現の大半を読めるようになり、必要なものを毎回リファレンスを開かずに書けるレベルを目指します。

正規表現とは何か

正規表現は「文字列の集合」を記述するパターンです。入力に対して正規表現を実行すると、エンジンは「このパターンにマッチする部分文字列はあるか、あるならどこか」を判定します。この問いひとつが、検索・検証・分割・置換のすべてを支えます。パターン自体はリテラル・演算子・グループからなる小さな言語であり、ブロックが揃えば残りは組み合わせです。

リテラルとエスケープ

正規表現の中の多くの文字は自分自身にマッチします。「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 は各言語の専用ライブラリを使ってください。正規表現は、文法が「正規」であるテキストでのパターンマッチングに使うのが本筋です。

段階的にテスト・デバッグする

経験豊富なエンジニアでも正規表現は段階的に書きます。パターンの特徴的な部分から始め、マッチするはずの例・マッチしないはずの例で検証し、境界条件やエッジケースを加えていきます。本サイトの正規表現テスター(ブラウザ内で動作)のように即座にフィードバックを得られるツールを使うと、プログラム全体を実行して試行錯誤するより遥かに効率的です。

よくある質問

正規表現が想定より多くマッチするのはなぜ?
ほとんどは貪欲な量指定子のためです。「.*」はできるだけ多くマッチします。最短マッチが欲しい場合は「.*?」を使ってください。アンカーやワード境界も範囲を絞るのに有効です。
ドットをリテラルとしてマッチさせるには?
バックスラッシュでエスケープします: 「\.」。文字クラス内なら「[.]」でも動きます([ ] の中ではほとんどのメタ文字がリテラル扱いになります)。
言語ごとに正規表現の文法は違いますか?
わずかに異なります。JavaScript・Python(re)・PCRE・.NET・POSIX は多くの機能を共有しますが、後読み・名前付きグループ・Unicode プロパティクラスなどの高度機能は差があります。本ガイドの基本要素はどの言語でも通用します。
正規表現で任意の入力を検証できますか?
形(電話番号・日付・16 進カラーらしい形か)の判定には使えますが、意味の検証には使えません。「2026-13-45」が日付の形をしていることは判定できますが、実在しない日付であることは日付パーサでないと分かりません。

まとめ

リテラル・クラス・量指定子・アンカー・グループ・フラグといった構成要素を押さえれば、日々の業務で必要な正規表現の大半は読み書きできるようになります。コードに貼る前に、本サイトの正規表現テスターでブラウザ内でパターンを試し、フラグ切り替えとキャプチャグループの可視化を活用してください。

関連ツール