Оператор PowerShell -replace
:
использует регулярное выражение (обычный выражение) как поиск (1-й) операнд
- , если вы хотите использовать строку поиска дословно , экранируйте ее с помощью
[regex]::Escape()
(в строковых литералах можно альтернативно \
-создать отдельные символы, которые в противном случае были бы интерпретированы как метасимволы регулярных выражений).
использует не-литеральная строка, которая может относиться к тому, что регулярное выражение совпало как замена (2-й) операнд через $
с префиксом такие токены, как $&
или $+
(см. ссылку выше или Подстановки в регулярных выражениях ).
- , если вы хотите использовать строку замены дословно , двойной любой
$
символов. в нем (см. Ниже).
Если ваша строка поиска и ваша замена цементная колонна должна использоваться дословно , рассмотрите возможность использования типа *1068*.Replace()
метод вместо этого, как показано в полезный ответ Брэндона Олина .
Предупреждение: .Replace()
чувствительно к регистру - чувствительно по умолчанию, тогда как -replace
нечувствительно к регистру * нечувствительно (как PowerShell обычно ); используйте другую перегрузку .Replace()
для нечувствительности к регистру или, наоборот, используйте вариант -creplace
в PowerShell для получения чувствительности к регистру.
- регистр- нечувствительный
.Replace()
пример:
'FOO'.Replace('o', '@', 'CurrentCultureIgnoreCase')
.Replace()
быстрее, чем -replace
, хотя это имеет значение только в циклах с большим числом итераций.
Если в вашем случае использовать оператор -replace
, вы можете использовать метод .Replace()
для требуемого экранирования операнда -replace
замены:
# *Doubling* the `$` in the replacement operand ensures that they're used verbatim.
'word' -replace 'word', '@#$+'.Replace('$', '$$')
Вы также можете сделать это с помощью вложенной -replace
операции, но это становится громоздким (\$
экранирует $
в регулярном выражении; $$
представляет собой single $
в строке замены):
# Same as above.
'word' -replace 'word', ('@#$+' -replace '\$', '$$$$')
Другими словами:
'word'.Replace('word','@#$+')
:
'word' -creplace [regex]::Escape('word'),'@#$+'.Replace('$', '$$')
Однако, как указано, если и строка поиска, и операнд замены должны использоваться дословно, то использование .Replace()
является предпочтительным, так как для краткости и производительности.