Мэтт Феллоуз имеет правильный ответ о том, как это исправить. Я верю, что могу попытаться объяснить, почему это так ломается, хотя ...
Учтите это:
Regex.Replace ("AAA", @ "Z *", "!!! | $ & |")
Будет возвращено:
!!!||A!!!||A!!!||A!!!||
Z * в этом случае будет соответствовать серии строк нулевой длины, каждая из которых расположена до или после одного из символов А. $&
вставляет совпадающую строку, которая в этом случае, которую мы видим, пуста.
Похожая вещь случается с
Regex.Replace("AAA", @"A*", "!!!|$&|")
Что возвращает
!!!|AAA|!!!||
Соответствие A * начинается в начале и соответствует «AAA». Затем он соответствует "" и затем останавливается.
Я не уверен, является ли это желаемым поведением в этом случае, но я подозреваю, что это необходимый побочный эффект способа, которым A * соответствует строкам нулевой длины.
Конечно, когда вы изменяете шаблон на ^A*$
, привязка означает, что существует только одно возможное совпадение, и больше похожа на ожидаемую в этом случае.