正規表現の量指定子 — 貪欲マッチングと最小マッチングの解説
正規表現の量指定子をマスター:*, +, ?, {n}, {n,m}。貪欲(greedy)マッチングと怠惰(lazy/non-greedy)マッチングの違いを実用例で理解しましょう。
Quantifiers
詳細な説明
正規表現の量指定子:貪欲 vs 怠惰
量指定子は、前の要素が何回マッチするかを制御します。貪欲モードと怠惰モードの違いを理解することは、正確なパターンを書くために不可欠です。
標準的な量指定子
| 量指定子 | 意味 |
|---|---|
* |
0回以上 |
+ |
1回以上 |
? |
0回または1回(省略可能) |
{n} |
ちょうどn回 |
{n,} |
n回以上 |
{n,m} |
n回からm回 |
貪欲モード(デフォルト)
デフォルトでは、量指定子は貪欲です:パターン全体が成功する限り、できるだけ多くの文字にマッチします。例えば、文字列 <b>bold</b> に対してパターン <.+> は <b>bold</b> 全体にマッチします。.+ ができる限りすべてを消費するためです。
怠惰モード(非貪欲)
量指定子の後に ? を追加すると怠惰になります:できるだけ少ない文字にマッチします。パターン <.+?> を <b>bold</b> に適用すると、最初に <b> にマッチし、次に </b> に別々にマッチします。
| 貪欲 | 怠惰 | 動作 |
|---|---|---|
* |
*? |
0回以上、少ない方を優先 |
+ |
+? |
1回以上、少ない方を優先 |
? |
?? |
0回または1回、0回を優先 |
使い分け
- 貪欲は曖昧さのない単純なパターンには通常問題ありません
- 怠惰はペアの区切り文字(HTMLタグ、引用符、括弧)のマッチングに不可欠です
- 代替として否定文字クラスの使用を検討してください:
<[^>]+>は<.+?>よりも明確で高速なことが多いです
パフォーマンスの考慮事項
怠惰な量指定子は長い文字列で過度なバックトラッキングを引き起こす可能性があります。可能な場合は、パフォーマンス向上のために否定文字クラスやアトミックグループを優先してください。
ユースケース
HTMLタグ間のコンテンツを抽出する、引用文字列にマッチする、またはデリミタ間の最短マッチを最長ではなく見つける必要があるテキストを解析する場合。