8

文字列があるとしましょう:

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

正規表現を使用して、コロンで区切られた文字列のセクションを名前付きグループに一致させたいと思います。例えば:

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

この $pattern は $string1 と正常に一致し、次の一致になります。

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

これは良いことですが、問題があります。$string1 の 3 番目のセクションが欠落している可能性があります。次に例を示します。

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

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

4

2 に答える 2

7

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

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

また、少なくとも最初は正規表現を固定する必要があります。

于 2011-12-20T23:35:58.793 に答える
2

@fgeの答えは機能するはずですが、これだけで十分な場合は、 String.Split を使用して必要なものを取得することをお勧めします。

$split = $string1.split(':')
if(($split.count -eq 2) -or ($split.count -eq 3)){
    #use $split[0] etc.
}
于 2011-12-20T23:42:55.897 に答える