2011-12-20 12 views
5

Diciamo che ho una stringa:PowerShell Regex - opzionale gruppo denominato corrisponde

$string1 = "Hello_World:How, are, you:-all -is -well" 

Vorrei usare una regex per abbinare le sezioni della stringa separati da due punti di in gruppi denominati. Per esempio:

$pattern = "(?<first>.*)\:(?<second>.*)\:(?<third>.*)" 

Questo modello corrisponde a $ $ stringa1 con successo e vorrei finire con i seguenti incontri:

first=Hello_World 
second=How, are, you 
third=-all -is -well 

Questo è un bene, ma c'è un problema. Il $ stringa1 potrebbe potenzialmente mancare la terza sezione, ad esempio:

$string1 = "Hello_World:How, are, you" 

Purtroppo, questo $ stringa1 non corrisponde al modello regex. Come faccio a fare in modo che il pattern corrisponda a entrambi i formati di stringa? (Ad esempio, dovrei sempre avere una corrispondenza "prima" e "seconda", e solo una "terza" corrispondenza se fornita).

risposta

5

Utilizzare il quantificatore ? e un gruppo non acquisibile. Inoltre, non utilizzare .*!

(?<first>[^:]*):(?<second>[^:]*)(?::(?<third>.*))? 

Inoltre, si dovrebbe ancorare la vostra espressione regolare, almeno all'inizio.

2

@ risposta di fge dovrebbe funzionare, ma se questo è tutto ciò che state facendo, vi consiglio di utilizzare String.Split per ottenere quello che ti serve:

$split = $string1.split(':') 
if(($split.count -eq 2) -or ($split.count -eq 3)){ 
    #use $split[0] etc. 
} 
+0

Yep, che è più semplice. Tuttavia, esito a dare questo il +1 finché l'OP conferma che le diverse parti _do non_ contengono ':' - non che la mia soluzione gestisca correttamente questo, heh. – fge

Problemi correlati