2011-12-20 5 views
5

Скажут, у меня есть строка:Powershell Regex - опциональная группа соответствует

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

Я хотел бы использовать регулярное выражение, чтобы соответствовать разделам строки разделенной Колона в именованные группы. Например:

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

Это $ шаблон будет соответствовать $ string1 успешно, и я бы в конечном итоге со следующими матчами:

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

Это хорошо, но есть проблема. $ String1 не может быть потенциально отсутствует третий раздел, например:

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

К сожалению, это $ string1 больше не соответствует шаблону регулярного выражения. Как сделать так, чтобы шаблон соответствовал обоим форматам строки? (т. е. у меня всегда должно быть «первое» и «второе» совпадение, и только «третье» совпадение, если оно предусмотрено).

ответ

5

Использовать квантор ? и группу, не связанную с захватом. Кроме того, не используйте .*!

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

Кроме того, вы должны закрепить свое регулярное выражение, по крайней мере, в начале.

2

@ ответ FGE должен работать, но если это все, что вы делаете, я рекомендую вам использовать String.split, чтобы получить то, что вам нужно:

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

Yep, что является более простым. Тем не менее, я не решаюсь дать это +1, пока OP подтверждает, что разные части _do not_ содержат ':' - не то, что мое решение справляется с этим правильно, хе. – fge

Смежные вопросы