Заменить для всей строки производит повторяющийся текст замены - PullRequest
8 голосов
/ 30 ноября 2011

Простой вопрос: почему

"x" -replace ".*", "y"

производить "уу"?

Ответы [ 2 ]

8 голосов
/ 30 ноября 2011
"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', '']
4 голосов
/ 30 ноября 2011

Поскольку вы сопоставляете два раза, * сначала сопоставляет всю строку, так как она жадная.И тогда это ничего не соответствует.Спасибо @Tim за его комментарий.

То, что вы должны использовать, это .+.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...