"x" -replace ".*", "y"
является эквивалентом
[Regex]::replace("x",".*","y")
Результат yy
, который вы видите, основан на том, как это работает, согласно MSDN:
В указанной входной строке заменяет все строки , которые соответствуют
указанное регулярное выражение с указанной строкой замены.
http://msdn.microsoft.com/en-us/library/e7f5w83z.aspx
Замена найдет строку, соответствующую регулярному выражению, и заменит ее на данную замену. Следовательно, x заменяется на y, а затем пустая строка заменяется на y, и вы получаете yy
.
Это можно проверить, выполнив [Regex]::matches("x",".*")
- он дает два совпадения - одно для пустой строки и одно для x.
С точки зрения других механизмов регулярных выражений это происходит из-за g
или глобального флага.
Это также можно проверить в Python следующим образом (просто чтобы показать, что это не ограничивается Powershell / .Net):
>>> re.findall(".*","x")
['x', '']