2009-06-18 1 views
17

In PowerShell mi ritrovo a fare questo genere di cose più e più volte per le partite:Esiste un modo più breve per estrarre i gruppi da un'espressione regolare di Powershell?

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

Quindi, in pratica - eseguire un comando che genera righe di testo, e per ogni linea voglio eseguire un comando su una regex capture all'interno della linea (se corrisponde). Sembra davvero semplice. Quanto sopra funziona, ma esiste un modo più breve per estrarre i gruppi di acquisizione regolare? Perl aveva $ 1 e così via, se ricordo bene. Posh deve avere qualcosa di simile, giusto? Ho visto i riferimenti "$ matches" su SO, ma non riesco a capire che cosa rende questo set.

Sono molto nuovo a PowerShell btw, ho appena iniziato ad imparare.

risposta

14

È possibile utilizzare l'operatore -match riformulare il vostro comando come:

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

Eh? Sta facendo corrispondere una linea che inizia con double-slash (//) e che combina avidamente fino a (ma escludendo) il primo hash (#). Non c'è un indicatore di fine riga, quindi non corrisponde specificamente all'intera linea. –

+0

Sì, questo è il tipo di cosa che stavo cercando. Grazie per la modifica, Bas. – scobi

4

Si potrebbe provare questo:

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

Per me questo emette una riga vuota se l'input non corrisponde. La risposta di [Bas Bossink] (http://stackoverflow.com/a/1011163/111424) funziona come questa ma restituisce solo le corrispondenze. –

7

Chiamato sostituzione

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

Ritorni: foo

senza nome ricambio

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

Ritorni: ar zar foo