2011-12-20 9 views
5

Powiedzmy mam ciąg znaków:PowerShell Regex - opcjonalny nazwie mecze grupowe

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

chciałbym użyć wyrażenia regularnego, aby dopasować fragmenty napisu oddzielone dwukropkiem użytkownika do wymienionych grup. Na przykład:

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

Ten wzór będzie pasował $ $ łańcuch1 powodzeniem i chciałbym skończyć z następujących meczów:

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

To jest dobre, ale nie jest to problem. Łańcuch $ 1 potencjalnie może nie zawierać trzeciej sekcji, na przykład:

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

Niestety ten łańcuch $ 1 nie pasuje już do wzorca regex. Jak zrobić, aby wzorzec dopasował oba formaty ciągu? (tzn. zawsze powinienem mieć mecz "pierwszy" i "drugi", i tylko "trzeci" mecz, jeśli jest dostępny).

Odpowiedz

5

Użyj kwantyfikatora ? i grupy niezapisującej. Ponadto nie używaj .*!

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

Powinieneś także zakotwiczyć swoje wyrażenie regularne przynajmniej na początku.

2

@ odpowiedź FGE powinno działać, ale jeśli to wszystko robisz, polecam skorzystanie String.split aby dostać to, czego potrzebujesz:

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

Tak, to jest bardziej proste. Waham się jednak dać +1, o ile PO potwierdzi, że różne części nie zawierają ':' - nie, że moje rozwiązanie poprawnie to obsługuje, heh. – fge