2011-12-20 12 views
5

に一致するのは、私は、文字列があるとしましょう:PowerShellの正規表現 - オプションの名前のグループが

$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が潜在的に、たとえば、3番目のセクションが欠落することはできなかった。

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

残念ながら、この$のstring1がもはや正規表現パターンにマッチします。パターンを両方の形式の文字列に一致させるにはどうすればよいですか? (つまり、常に「第1」と「第2」の一致があり、提供されている場合は「第3」の一致のみがある)。

答えて

5

?数量詞と非キャプチャグループを使用します。また、.*を使用しないでください!

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

また、最初に正規表現を固定する必要があります。 FGEの答えに動作するはずです@

2

が、これは、あなたがやっているすべてのであれば、私はあなたが必要なものを手に入れるのstring.Splitを使用することをお勧めします:よりシンプルである

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

うん、。しかし、私は、OPがOPの中に別の部分に ':'が含まれていることを確認している限り、+1を与えることを躊躇しています。 – fge

関連する問題