Подтвердить что ты не робот

PowerShell: Quoting -replace & variables

Это ответ на мой предыдущий вопрос:

PowerShell: -replace, regex и ($) долларовые знаки

Мой вопрос: почему эти 2 строки кода имеют разный вывод:

'abc' -replace 'a(\w)', '$1'
'abc' -replace 'a(\w)', "$1"

И в соответствии с двумя статьями ниже, почему переменная '$ 1' в одинарных кавычках не используется как буквальная строка? Все в одинарных кавычках следует рассматривать как буквальную текстовую строку, правильно?

http://www.computerperformance.co.uk/powershell/powershell_quotes.htm
http://blogs.msdn.com/b/powershell/archive/2006/07/15/variable-expansion-in-strings-and-herestrings.aspx

4b9b3361

Ответ 1

Когда вы используете одинарные кавычки, вы указываете PowerShell использовать строковый литерал, означающий, что все, что находится между кадром открытия и закрытия, должно интерпретироваться буквально.

Когда вы используете двойные кавычки, PowerShell будет интерпретировать определенные символы внутри двойных кавычек.

См. get-help about_quoting_rules или нажмите здесь.

Знак доллара имеет особое значение в регулярных выражениях и в PowerShell. Вы хотите использовать одинарные кавычки, если вы намерены использовать знак доллара в качестве регулярного выражения.

В вашем примере регулярное выражение a(\w) соответствует букве "a", а затем символ слова, записанный в обратной ссылке # 1. Поэтому, когда вы заменяете $1, вы заменяете согласованный текст ab совпадением обратной ссылки b. Итак, вы получаете bc.

В вашем втором примере с использованием двойных кавычек PowerShell интерпретирует "$1" как строку с переменной $1 внутри. У вас нет переменной с именем $1, поэтому она равна нулю. Поэтому регулярное выражение заменило ab на нуль, поэтому вы получаете только c.

Ответ 2

Во второй строке:

'abc' -replace 'a (\ w)', "$ 1"

Powershell заменяет $1 до того, как получит операцию замены регулярных выражений, как утверждают другие. Вы можете избежать этой замены, используя обратную сторону, как в:

'abc' -replace 'a (\ w)', "` $1"

Таким образом, если у вас была строка в префиксе переменной $, которую вы хотели включить в заменяющую строку, вы можете использовать ее в двойных кавычках, например:

'abc' -replace 'a (\ w)', "$ prefix` $1"

Ответ 3

"$ 1" является регулярным выражением регулярного выражения. Он создается с помощью регулярного выражения, и он существует только в контексте этой операции замены. Это не переменная powershell.

"$ 1" будет интерпретироваться как переменная Powershell. Если переменная с именем $1 не существует, значение замены будет равно null.