量指定子と空一致

量指定子 *、+、{n,m} (およびそれぞれに対応する最短一致の量指定子) は、最小回数の n 回繰り返される文字列が見つかった場合、空一致の後では繰り返しを行いません。この規則により、m が無限のときに、量指定子が空一致の無限ループに入ることを回避できます。ただし、この規則は m が有限の場合にも適用されます。

たとえば (a?)* の場合、文字列 "aaa" に一致しますし、パターン (a)(a)(a)(). から部分文字列をキャプチャします。5 個目の空キャプチャのないことに注目してください。これは、4 個目の空キャプチャが発生すると量指定子が繰り返しを停止するからです。

同様に、(a\1|(?(1)\1)){0,2} の場合、()(a). を展開しようとはしないため、"a" ではなく空文字列に一致します。{0,2} 量指定子では、最後の反復処理の空一致だけが許可されます。反対に、(a\1|(?(1)\1)){2} の場合は、()(a) を実行しようとするため、実際に "a" に一致します。反復の最小回数は 2 で、空一致の後でエンジンが繰り返さなければならない回数になります。

参照

その他の技術情報

.NET Framework の正規表現