2011-10-04 3 views
0

나는 쓰기를 시도 - 행운과 - 같은 문자열에서 필터 기준을 추출 할 수 정규식 :구글에서 AdvancedSearch 같은 C#을 정규 표현식

String rawFilter = "field1: something field3: something else field2: any number of words"; 

필드는 임의의 순서로 올 수 있습니다, 나는 추출해야 어떤 종류의 키 - 값 쌍리스트.

의견에서 요청대로. 정규식에 대해 알고있는 경우, 첫 번째 출력은 짝수 위치의 필드 이름과 홀수 위치의 값을 가진 배열이 될 수 있습니다. 그래서 :

Console.WriteLine(matches[0]); //Prints field1 
Console.WriteLine(matches[1]); //Prints something 
Console.WriteLine(matches[2]); //Prints field3 
Console.WriteLine(matches[3]); //Prints something else 
Console.WriteLine(matches[4]); //Prints field2 
Console.WriteLine(matches[5]); //Prints any number of words 
+0

당신이 기대하는 어떤 출력? – Stormenet

+0

필드 이름이 홀수 인 위치와 값이 짝수 인 배열이어야합니다. – MatteoSp

+0

현재 가지고있는 정규 표현식을 게시하십시오. –

답변

2

필드 명을 1 군에 있고 값이 2 군에 있습니다

Regex r = new Regex(@"(field\d:)\s*((?:(?!field).)*)"); 
      int i = 0; 
      foreach (Match m in r.Matches("field1: something field3: something else field2: any number of words")) { 
       Console.WriteLine(++i); 
       Console.WriteLine("{0} -{1}", 1, m.Groups[1].Value); 
       Console.WriteLine("{0} -{1}", 2, m.Groups[2].Value); 
      } 

인쇄 :

1 
1 -field1: 
2 - something 
2 
1 -field3: 
2 - something else 
3 
1 -field2: 
2 - any number of words 
+0

+1하지만 약간의 의견입니다. 가장 바깥 쪽 괄호는 필요하지 않습니다. 결과가 그룹 1과 2에 있도록 두 번째 그룹 앞에 공백을 제거 할 수 있도록 비 캡처 그룹을 사용합니다. (필드 : \ d :) \ s * ((? :(?! 필드).) *)'는 작은 개선이 될 것입니다. (결과는 .Groups [1]과 [2]에 있습니다!) – stema

+0

@ 스템타, 동의, 내 대답을 편집했습니다. – Stormenet

+0

답변을 수락했습니다. – MatteoSp