空一致後の次の検索

1 つの文字列の中で検索を繰り返す場合、NextMatch を呼び出すか、Regex.Matches から返されたコレクションを使用することによって、正規表現エンジンは空一致に対して特別な処理を行います。

通常、NextMatch は前回の検索が中止された位置から次の検索を開始します。ただし空一致の後では、NextMatch は通常の位置の 1 文字分先の位置から次の検索を試行します。この規則により、検索エンジンにより文字列全体が確実に処理されます。1 文字分先の位置から開始しないと、次の検索が前回と同じ場所から開始されるため、同じ空文字列に繰り返し一致してしまいます。

たとえば、文字列 "abaabb" の中で "a*" を検索すると、一致した文字列シーケンスが次のように返されます。

"a", "", "aa", "", "", ""

次のように返されることもあります。

(a)()b(aa)()b()b()

初回の検索で先頭の a が見つかります。2 回目の検索は初回の検索が終了した位置、最初の b の前から始まります。この検索では a が見つからないので空文字列が返されます。

3 回目の検索は、2 回目の検索が空文字列を返したため、2 回目の検索が終了した位置からは開始されません。代わりに、もう 1 文字進んで最初の b の後ろから開始されます。3 回目の検索では a が 2 つ見つかるので "aa" が返されます。

4 回目の検索は、3 回目の検索が終了した位置、2 番目の b の前から開始されるため、空文字列が見つかります。次に、5 回目の検索は、最後の b の前から開始され、再び空文字列が見つかります。6 回目の検索は最後の b の後ろから開始され、また空文字列が見つかります。

参照

その他の技術情報

.NET Framework の正規表現