2012-04-17 32 views
13

Tenía la impresión de que el reemplazo y el reemplazo eran exactamente lo mismo, sin embargo, descubrí que no podía realizar algunas tareas de RegEx con el reemplazo que podía reemplazar. ¿Podría alguien señalar lo que me estoy perdiendo?¿Cuál es la diferencia entre .replace y -replace in powershell?

Broken Regex replace: 
$a=$a.Replace('.:\\LOGROOT\\', "\\$env:computername\logroot\") 


Working Regex replace: 
$a=$a -Replace('.:\\LOGROOT\\', "\\$env:computername\logroot\") 

ps: El siguiente URL me lleva a pensar que hay opciones .replace no estoy familiarizado con, pero me parece que no puede encontrar ninguna información adicional sobre el uso de ellos, o cómo acceder a la ayuda de estos opciones. http://www.computerperformance.co.uk/powershell/powershell_regex.htm Regex.Replace (String, String, String, RegexOptions) y también: Métodos Regex.Replace (String, String, MatchEvaluator, RegexOptions).

Gracias

+1

Creo '-Replace' es un operador, mientras que' .Replace' es un método (en '$ a'). –

Respuesta

14

Si bien la respuesta de @Keith Colina explica la diferencia entre Replace método y el operador -replace, para explicar por qué es posible que no vea el mismo resultado, es porque está utilizando el método String.Replace que no hace cadena de reemplazar y -replace operador utiliza expresiones regulares reemplazar . Usted puede utilizar el método Regex.Replace para este propósito y debería ver el mismo efecto:

[regex]::replace($a,'.:\\LOGROOT\\', "\\$env:computername\logroot\") 

En resumen, el operador -replace es igual que Regex.Replace (la sobrecarga en particular vinculado arriba), pero en general Replace() puede ser instancia o método estático que puede estar haciendo algo completamente diferente de -replace

9

No son lo mismo. .Replace es un método .NET en System.String o en cualquier otro tipo con un método de instancia llamado Replace. -replace es un operador de PowerShell que usa expresiones regulares. Ejecute man about_operators para ver más información sobre el operador -replace.

+3

De hecho, para ser más específicos 'a -replace b, c' es el método .NET [' Regex.Replace (a, b, c, RegexOptions.IgnoreCase) '] (http://msdn.microsoft.com/en -us/library/taz3ak2f.aspx). – Richard