Powershell Regex - необязательные совпадения именованных групп - PullRequest
7 голосов
/ 21 декабря 2011

Допустим, у меня есть строка:

$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 больше не соответствует шаблону регулярных выражений.Как сделать так, чтобы шаблон соответствовал обоим форматам строки?(т.е. я всегда должен иметь «первое» и «второе» совпадение, и только «третье» совпадение, если оно предусмотрено).

Ответы [ 2 ]

6 голосов
/ 21 декабря 2011

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

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

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

2 голосов
/ 21 декабря 2011

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

$split = $string1.split(':')
if(($split.count -eq 2) -or ($split.count -eq 3)){
    #use $split[0] etc.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...