メインコンテンツへスキップ

← ブログ一覧へ

初心者のための正規表現:実用チートシート

正規表現は各部品が腑に落ちるまでは文字化けのように見えますが、一度わかれば最も便利な道具の一つになります。初心者でも覚えられるチートシートをどうぞ。

実際の実行結果、グループまで含めて。 正規表現テスターで、\b(\d{4})-(\d{2})-(\d{2})\bg フラグを付けて due 2026-07-27, shipped 2026-08-03 に当てました。結果は 2 match(es) で、それぞれ見つかった位置とともに列挙されます —— #1 "2026-07-27" @4#2 "2026-08-03" @24。1 画面に要点が 2 つ。g フラグがなければ最初の 1 件しか見えません。そして 3 組の括弧があるからこそ、年・月・日を個別に取り出せます。マッチした文字列を後からもう一度解析する必要はありません。

文字クラス

  • . —— 任意の文字(改行は除く。s フラグ時を除く)。
  • \d —— 数字;\D —— 数字以外。
  • \w —— 単語文字(英字・数字・アンダースコア);\W —— その逆。
  • \s —— 空白;\S —— 空白以外。
  • [abc] —— a・b・c のいずれか。[a-z] —— 範囲。[^abc] —— a・b・c 以外

量指定子(個数)

  • * —— 0 個以上。+ —— 1 個以上。? —— 0 か 1 個(省略可)。
  • {3} —— ちょうど 3 個。{2,4} —— 2〜4 個。{2,} —— 2 個以上。
  • 量指定子の後ろに ? を付けると最小一致(できるだけ少なく):.+?

貪欲か非貪欲かは量詞で最も時間を奪う細部ですが、計測は 1 回で済みます。<b>bold</b> and <i>it</i> に対して <.+>1 件マッチ を返します。最初の < から最後の > まで丸ごと飲み込むからです。? を 1 つ足した <.+?>4 件マッチ:#1"<b>"@0 #2"</b>"@7 #3"<i>"@16 #4"</i>"@21? は「何がマッチできるか」を変えず、.+ が止まるまでにどこまで伸びるかだけを変えます。

アンカーと境界

  • ^ —— 文字列の先頭(m 時は各行の先頭)。$ —— 末尾。
  • \b —— 単語境界 —— \bcat\b のような単語単位の一致に便利。

マッチ数を診断に変えるのはオフセットです。私たちの正規表現テスターは各ヒットとその開始位置を列挙するので、Order 12, item 345, qty 7. に対する \d+ は 3 件マッチ となり、内容はこうです:

#1"12"@6 #2"345"@15 #3"7"@24

文字列だけでなく数値を読んでください。3 番目のヒットは 24 から始まります。つまり最後の 7 は句点ので見つかっており、.\d に含まれません。境界を 1 つ足すと集合はまるごと変わります。\b\w{5}\b が返すのは

#1"Order"@0

オフセット 0 の 1 件だけ。単独で立つ 5 文字の語は Order だけだからです。

グループと選択

  • ( … ) —— キャプチャグループ;一致したテキストがグループ 1、2… として記憶されます。
  • (?: … ) —— キャプチャしないグループ(構造のみ)。
  • a|b —— a または b に一致。

フラグ

  • g —— 最初だけでなくすべての一致を探す。
  • i —— 大文字小文字を区別しない。
  • m —— ^$ を各行で一致。
  • s —— . が改行にも一致。

いくつかの実用パターン

  • 数字のみ:^\d+$
  • 簡単な日付:\d{4}-\d{2}-\d{2}
  • 単語:\b\w+\b
  • 大まかなメール:[^@\s]+@[^@\s]+\.[^@\s]+

(本格的なメール検証は非常に難しいことで有名です —— この程度のパターンは簡易チェックには十分ですが、RFC に完全準拠した検証には向きません。)

4 つのパターンと、変えていない 1 つのテスト文字列(Order 12, item 345, qty 7.)を私たちの 正規表現テスターに通しました。マッチ数がそのまま教材です。返る量を決めるのはパターンで、文字列ではありません。

パターンマッチ数
\d+3 件マッチ
\d{2,}2 件マッチ
\b\w{5}\b1 件マッチ
[A-Z]\w+1 件マッチ

時間を大きく節約するコツ

  • 少しずつ組み立てる。 小さな部分から始めて追加し、一致の更新を見ながら進める。
  • 文字どおりの意味なら特殊文字をエスケープ:\.\?\(
  • 貪欲な .* に注意 —— できるだけ多く取り込みます。行き過ぎたら .*? やより具体的なクラスに。
  • 実データでテスト。失敗すると予想される境界ケースも含めて。

学ぶ最速の方法は、入力しながら一致がハイライトされるのを見ることです。無料の正規表現テスターでライブに試しましょう —— すべての一致をハイライトし、キャプチャグループを一覧表示します。すべてブラウザ内で動作します。

一歩進んで:先読み・後読みと名前付きグループ

基礎が腑に落ちたら、次の機能で表現力が一気に広がります:

  • 先読み(lookahead) (?=…)否定先読み (?!…):直後が一致する(またはしない)場合だけその位置に一致し、その部分は消費しません。\d(?=px) は「直後に px が続く数字」に一致します。
  • 後読み(lookbehind) (?<=…)(?<!…):直前について同じことをします。今では広くサポートされています(JavaScript は ES2018 以降、PCRE や .NET も)。
  • 名前付きグループ (?<year>\d{4}):\1\2 を数えるより格段に読みやすく、\k<year> や置換文字列内で名前から参照できます。

よくある間違い

  • […] の中では特殊文字が働かない。 文字クラス内では .*( は文字どおりで、特殊なのは ^(先頭)・-(文字の間)・]\ だけ。だから [.?] はピリオドか疑問符そのものに一致します。
  • \d は常に Unicode とは限らない。 JavaScript の \d はちょうど [0-9] ですが、他の書記系の数字まで含める engine もあります。ASCII のつもりなら [0-9] と書きましょう。
  • 破滅的バックトラッキング。 重なり合うテキストへの入れ子の量指定子——たとえば長い不一致文字列に対する (a+)+$——はエンジンを固まらせることがあります。曖昧さをなくすよう書き換えましょう。

最も時間を奪う誤りは、量詞が「自分が読むのをやめる場所」で止まると思い込むことです。<b>bold</b> and <i>it</i> に対して非貪欲な <.+?> が返すのは

#1"<b>"@0 #2"</b>"@7 #3"<i>"@16 #4"</i>"@21

0、7、16、21 の 4 件 —— タグだけで、間の内容は 1 つもありません。貪欲な <.+> は 0 の 1 件を返し、文字列全体を覆います。同じ文字、同じ入力で、違いは ? 1 つだけです。

さらに続けるなら

解読する価値のある簡潔な構文は正規表現だけではありません——ジョブをスケジュールするなら、あの「文字化けに見えて、通じると分かる」感覚は Cron 式にもそのまま当てはまります。