2009-06-18 15 views
17

En PowerShell me encuentro haciendo este tipo de cosas una y otra vez para partidos:¿Hay alguna forma más corta de extraer grupos de una expresión regular Powershell?

some-command | select-string '^(//[^#]*)' | 
    %{some-other-command $_.matches[0].groups[1].value} 

Así que, básicamente - ejecutar un comando que genera líneas de texto, y para cada línea que desea ejecutar un comando en una captura de expresiones regulares dentro de la línea (si coincide). Parece muy simple. Lo anterior funciona, pero ¿hay una manera más corta de sacar esos grupos de captura de expresiones regulares? Perl tenía $ 1 y así sucesivamente, si mal no recuerdo. Posh tiene que tener algo similar, ¿verdad? He visto referencias de "$ matches" en SO, pero no puedo entender qué hace que eso se establezca.

Soy nuevo en PowerShell por cierto, acabo de empezar a aprender.

Respuesta

14

Usted puede utilizar el operador -match reformular su comando como:

some-command | Foreach-Object { if($_ -match '^(//[^#]*)') { some-other-command $($matches[1])}} 
+0

Eh? Está haciendo coincidir una línea que comienza con doble barra inclinada (//) y empareja con avidez hasta (pero excluyendo) el primer hash (#). No hay marcador de fin de línea, por lo que no está haciendo coincidir específicamente toda la línea. –

+0

Sí, ese es el tipo de cosa que estaba buscando. Gracias por la edición, Bas. – scobi

4

Usted podría intentar esto:

Get-Content foo.txt | foreach { some-othercommand [regex]::match($_,'^(//[^#]*)').value } 
+0

Para mí esto da como resultado una línea en blanco si la entrada no coincide. La respuesta de [Bas Bossink] (http://stackoverflow.com/a/1011163/111424) funciona como esta, pero solo muestra las coincidencias. –

7

sustitutos designados

'foo bar' -replace '(?<First>foo).+', '${First}' 

devoluciones: foo

repuesto Sin nombre

'foo bar' -replace '(foo).+(ar)', '$2 z$2 $1' 

devoluciones: ar zar foo

Cuestiones relacionadas