Question PowerShell: citant -replace et variables


Ceci est en réponse à ma question précédente:

PowerShell: -replace, regex et ($) signes de dollar

Ma question est la suivante: pourquoi ces 2 lignes de code ont-elles une sortie différente:

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

ET selon les 2 articles ci-dessous, pourquoi la variable '$ 1' dans les guillemets simples n'est-elle pas utilisée comme chaîne littérale? Tout entre guillemets simples doit être traité comme une chaîne de texte littérale, n'est-ce pas?

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


13
2018-02-23 22:48


origine


Réponses:


Lorsque vous utilisez des guillemets simples, vous indiquez à PowerShell d'utiliser un littéral de chaîne, ce qui signifie que tout ce qui se trouve entre les guillemets d'ouverture et de fermeture doit être interprété littéralement.

Lorsque vous utilisez des guillemets doubles, PowerShell interprète des caractères spécifiques entre guillemets.

Voir get-help about_quoting_rules ou cliquez sur ici.

Le signe dollar a une signification particulière dans les expressions régulières et dans PowerShell. Vous voulez utiliser les guillemets simples si vous souhaitez que le signe dollar soit utilisé comme expression régulière.

Dans votre exemple, la regex a(\w) correspond à la lettre «a» puis à un caractère de mot saisi dans la référence arrière # 1. Donc, quand vous remplacez par $1 vous remplacez le texte correspondant ab avec correspondance de référence b. Donc, vous obtenez bc.

Dans votre deuxième exemple, en utilisant des guillemets doubles, PowerShell interprète "$1" sous forme de chaîne avec la variable $1 à l'intérieur. Vous n'avez pas de variable nommée $1 donc c'est nul. Donc la regex a remplacé ab avec null c'est pourquoi vous obtenez seulement c.


18
2018-02-23 23:16



Dans votre deuxième ligne:

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

Powershell remplace le $ 1 avant que celui-ci n'intervienne dans l'opération de remplacement des regex, comme d'autres l'ont déjà indiqué. Vous pouvez éviter ce remplacement en utilisant un backtick, comme dans:

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

Ainsi, si vous aviez une chaîne dans un préfixe de variable que vous souhaitiez inclure dans la chaîne de remplacement, vous pourriez l’utiliser dans les guillemets comme ceci:

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


12
2017-09-26 22:51



Le "$ 1" est une référence inverse. Il est créé par la correspondance regex et n'existe que dans le contexte de cette opération de remplacement. Ce n'est pas une variable PowerShell.

"$ 1" sera interprété comme une variable Powershell. Si aucune variable appelée $ 1 n'existe, la valeur de remplacement sera nulle.


3
2018-02-23 23:18