2017-12-11 8 views
2

죄송합니다. 어리석은 질문 일 수 있습니다.하지만 조금 문제를 해결할 수 없으며 Google에서 같은 질문을 찾을 수 없습니다. 그래서, 나는 여기에 쓸 줄 알았다.C# regex groups trouble

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}"); 
    } 
} 

그러나 출력은 다음과 같습니다 왜 이해할 수 없다 :

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

이에 대한 나의 코드는 다음과 같습니다

경기 :

없음 0 나는 같은 문자열을 구문 분석 할 필요가 값 : 안녕 내 이름 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

, 모든 두 번째 캡처 캡처을 캡처 얻을 :
모든 반복을 캡처하는 반복 그룹 주위에 캡처 그룹을 넣어 그룹 :

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

정의에 따라 반복 캡처 그룹은 마지막 반복 만 캡처합니다. 첫 번째 캡처 그룹과 캡처 한 값을 얻기 위해 그룹 1 개 값을 잡아해야

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

C#은 최종 일치를 캡처하지 않습니다. C#은 실제로 모든 캡처를 유지합니다. – ctwheels

+0

@ctwheels, 네, 맞아요 C#. 알아. 필자는 일반적인 EMCA 그룹 포착 구현을 강조하고있었습니다. –