2017-02-15 9 views
3

私はRegexをPowerShellで使ってパーサを作っています。これまでのところ、私が持っている問題を除いて、これまでのところうまくいきます。グループ番号を取得する

\s*([a-zA-Z_]+)\s*=(?:\s*"(.*)"|([^;#]*)) 

私は成功を収めて、この正規表現がマッチできるようにしました、これらのシナリオ:

Name= "Value" ;Comment

=後に引用符の間にすべてを取ると

残り

Name=Value ;Comment
を無視ウィルウィル =の後ろのすべてを ;または #の値で

これは素晴らしいですが、私が抱えている問題は、シナリオ1が値[2]にマッチし、シナリオ2が値[3]にマッチすることです。これは最終的な価値のために何が含まれているかをチェックします。私はそれがきれいではないので、必ずしも必要ではありません。そこで、ここに質問があります。Value [2]には、これらの2つの異なるグループの結果がどのように含まれていますか? (全く別の正規表現を使用すると、私はすでにこの1何度か書き換えましたが、問題ではありません)

+1

を([^ "] *?)\ 2 \ s * [;#]'](https:/) /regex101.com/r/R9LcE3/2) – Faibbus

+0

これはこれ以上キャプチャしません 'Name =" Value1; Value2 "' =の後にスペースを取りません。引用符が指定されていない場合: 'Name = been been ' によって見つけられました。 – Blah

+0

私は、交替をキャプチャグループとレモ'^ \ s *(\ w +)\ s * = \ s *("。*? "| [^;#] *)' –

答えて

0

ではなく、非キャプチャグループの名前のキャプチャグループを使用します。このようなことについてどのように

$pattern = '\s*([a-zA-Z_]+)\s*=(?<value>\s*"(.*)"|([^;#]*))' 
$value = ($string |Select-String -Pattern $pattern).Matches.Groups['value'].Value.Trim(' "') 
+0

あなたの答えは正しい方向につながりますが、一致するものに '' 'が含まれています – Faibbus

+0

@Faibbusは簡単に解決します:-) –

+0

このようにしても、=の後にスペースを入れることはできません。 :名前=あなたの内部のグループに同じ名前を付けてこれを行うことができます – Faibbus

関連する問題