2017-12-11 11 views
2

私は申し訳ありませんが、愚かな質問かもしれないが、私はほとんど問題を解決することはできませんし、Googleで同じ質問を見つけることができません。だから、私はここに書くと思った。私は同じ文字列を解析する必要があります。C#正規表現グループの問題

string line = "HELLO MYNAME IS1 = {P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55}"; 

をそのための私のコードは次のとおりです。

string line = "HELLO MYNAME IS1 = {P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55}"; 
Regex re = new Regex(@"^HELLO MYNAME ([A-Za-z0-9]+) = {([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+}"); 
MatchCollection matchCollection = re.Matches(line); 
foreach(Match m in matchCollection) 
{ 
    Console.WriteLine("Match: "); 
    foreach(Group gr in m.Groups) 
    { 
     Console.WriteLine($"No {gr.Index} Value: {gr.Value}"); 
    } 
} 

しかし、出力は次のようになりますなぜ私が理解することはできません。

マッチ:

ありません0値:HELLO MY NAME IS1 = {P 111.11、O -222.22、L 333.33、L -444.44、Y 555.55} No 13値:IS1 No 62値:Y 555.55

もう一度申し訳ありませんが、最後のグループだけが結果に行く理由を私に説明できますか?

+0

[(?:^ HELLO MYNAME(\ w +)= {| \ G(?!A)\ s *、\ s *)([AZ] \ s [+ - ]?\ d + \。\ d +) '](http://regexstorm.net/tester?p=%28%3f%3a%5eHELLO+MYNAME+%28%5cw%2b%29+%3d+%7b%7c%5cG%28 %3f!%5cA%29%5cs%%2c%5cs%%29%28%5ba-Z%5d%5cs%5b%2b-%5d%3f%5cd%2b%5c。%5cd%2b%29&i = HELLO + MYNAME + IS1 +%3d +%7bP + 111.11%2c + O + -222.22%2c + L + 333.33%2c + L + -444.44%2c + Y + 555.55%7d) – ctwheels

答えて

2

あなたが最初のキャプチャグループでキャプチャした値を取得するには、グループ1つの値をつかむと、すべてのが第二の撮影で撮影をキャプチャを取得する必要グループ:

0:

string line = "HELLO MYNAME IS1 = {P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55}"; 
Regex re = new Regex(@"^HELLO MYNAME ([A-Za-z0-9]+) = {([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+}"); 
MatchCollection matchCollection = re.Matches(line); 
foreach(Match m in matchCollection) 
{ 
    Console.WriteLine("Match: "); 
    Console.WriteLine(m.Groups[1].Value); 
    foreach (Capture cap in m.Groups[2].Captures) 
     Console.WriteLine($"No {cap.Index} Value: {cap.Value}"); 
} 

C# demo

出力を参照してください。

Match: 
IS1 
No 20 Value: P 111.11, 
No 30 Value: O -222.22, 
No 41 Value: L 333.33, 
No 51 Value: L -444.44, 
No 62 Value: Y 555.55 
+1

ありがとう、私はそれについて知らなかった – Polly

2

定義によって、繰り返しのキャプチャグループは最後の反復のみをキャプチャします。
すべての反復をキャプチャするために繰り返しグループの周りのキャプチャグループを置く:

^HELLO MYNAME ([A-Za-z0-9]+) = {(([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+)} 
+0

C#は最後のマッチをキャプチャするだけではありません。 C#は実際にすべてのキャプチャを保持します。 – ctwheels

+0

@ctwheels、はい、そうですC#はそうではありません。知っている。私は一般的なEMCAのグループ・キャプチャの実装に取り​​組んでいました。 –