正規表現入門:貪欲マッチと非貪欲マッチの違い
作成日:2025.08.31
正規表現の基本的な挙動のひとつである「貪欲マッチ」と「非貪欲マッチ」の違いを、具体例とともに分かりやすく解説します。各マッチング方法がどのように働くかを実践的なコード例を交えながら説明し、用途に合わせた使い分けのポイントを紹介します。
貪欲マッチ (Greedy Match)
貪欲マッチは、可能な限り多くの文字をマッチさせる動作を指します。正規表現の量指定子(例えば、*
、+
、{n,}
)はデフォルトで貪欲マッチとして動作します。
例えば、以下のような文字列があるとします。
竜王戦[[title01]]\n名人戦[[title02]]\n叡王戦[[title03]]\n王位戦[[title04]]\n王座戦[[title05]]\n棋聖戦[[title06]]\n棋王戦[[title07]]\n王将戦[[title08]]\n
この中から「[[」と「]]」で囲まれた部分を抽出したいと考え、、以下のような正規表現を使用した場合、
\[\[(.*)\]\]
貪欲マッチのため、最初の「[[」から最後の「]]」までがマッチしてしまい、結果として以下のように一つの大きなマッチが得られます。
竜王戦[[title01]]\n名人戦[[title02]]\n叡王戦[[title03]]\n王位戦[[title04]]\n王座戦[[title05]]\n棋聖戦[[title06]]\n棋王戦[[title07]]\n王将戦[[title08]]\n
非貪欲マッチ (Non-Greedy Match)
非貪欲マッチは、可能な限り少ない文字をマッチさせる動作を指します。量指定子に?
を追加することで非貪欲マッチを実現できます。
先ほどと同じ文字列に対して、以下のような正規表現を使用した場合、
\[\[(.*?)\]\]
非貪欲マッチのため、最初の「[[」から直近の「]]」までがマッチし、結果として以下のように複数のマッチが得られます。
竜王戦[[title01]]\n名人戦[[title02]]\n叡王戦[[title03]]\n王位戦[[title04]]\n王座戦[[title05]]\n棋聖戦[[title06]]\n棋王戦[[title07]]\n王将戦[[title08]]\n
このように、非貪欲マッチを使用することで、必要な部分だけを正確に抽出することができます。
まとめ
貪欲マッチは可能な限り多くの文字をマッチさせるのに対し、非貪欲マッチは可能な限り少ない文字をマッチさせます。正規表現を使用する際には、目的に応じてこれらのマッチング方法を使い分けることが重要です。

奈良市を拠点に、26年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
perl正規表現の基本:マッチした文字列を配列に格納する方法
2010.07.16
perlで正規表現を用いて、特定の条件にマッチした文字列を配列に格納する方法を解説します。数字抽出を例に、正規表現を使って特定パターンの文字列をリストとして管理する基本テクニックを紹介。
正規表現のメタ文字一覧とその使い方
2009.04.10
正規表現を使う際に知っておくべき基本的なメタ文字をまとめました。各メタ文字がどのように機能し、どんな場面で活用できるかを簡潔に解説します。
perlとPHPで使える、フォーム入力のエラーチェックに役立つ正規表現集
2009.03.28
フォームからのデータ送信はWebアプリケーションの基礎ですが、ユーザーが入力する内容が想定通りであるかを確認するためのエラーチェックは重要です。この記事では、perlとPHPでフォームデータをバリデートするための正規表現を具体例とともに紹介します。