Продолжение поиска после пустого совпадения
Обновлен: Ноябрь 2007
Если поиск соответствия выполняется по всей строке, либо с помощью вызова NextMatch, либо с использованием коллекции, возвращенной Regex.Matches, обработчик регулярных выражений предоставляет специальную обработку пустых совпадений.
Обычно NextMatch начинает следующий поиск точно с того же места, где закончен предыдущий. Однако после пустого совпадения NextMatch перемещается вперед на один знак перед новой попыткой поиска. Это правило необходимо для того, чтобы обработчик перемещался по строке. (Если он не переместится вперед, следующее соответствие начнется с того же места, что и предыдущее, и процесс зациклится на одной и той же пустой строке.)
Например, поиск "a*" в строке "abaabb" возвращает следующую последовательность соответствий.
"a", "", "aa", "", "", ""
А это другое представление, в контексте:
(a)()b(aa)()b()b()
Первое соответствие дает первую букву "a". Второе соответствие начинается точно с того места, где закончилось первое, перед первой буквой "b"; оно находит нулевое вхождение и возвращает пустую строку.
Третье соответствие не начинается точно там, где второе соответствие закончилось, так как второе соответствие вернуло пустую строку. Вместо этого оно начинается на один знак позже, после первой буквы "b". Третье соответствие обнаруживает два вхождения "a" и возвращает "aa".
Четвертое соответствие начинается с того места, где закончилось третье, перед второй буквой "b", и находит пустую строку. Затем пятое соответствие начинается перед последней буквой "b" и вновь находит пустую строку. Шестое соответствие начинается после последней буквы "b" и опять находит пустую строку.