2014-05-09 5 views
-2

비슷한 문자열이 있습니다.
SOI; 1; 2; 삼; 4; 5; 6; 7; SOI; 8; 9; 10; 11; 12; EOI; 13; EOI; SOI; 14; 15; 16; 17; 18; EOI;문자열을 C#에서 정규 표현식을 사용하여 분할합니다.

여기에서 SOI부터 시작하는 문자열을 분할해야합니다. EOI에;
출력은 다음과 같아야합니다.

[1]; 2; 삼; 4; 5; 6; 7; 13;
[1] - 8; 9; 10; 11; 12;
[2] - 14; 15; 16; 17; 18;

나는 아래의 코드

string regexexpr = "(?s)(?<=SOI;).+?(?=EOI;)";//@"SOI;(.*?)EOI;"; 
string sText = "SOI; 1; 2; 3; 4; 5; 6; 7;SOI; 8; 9; 10; 11; 12; EOI; 13; EOI; SOI; 14; 15; 16; 17; 18; EOI;"; 
MatchCollection matches = Regex.Matches(sText, @regexexpr); 
var sample = matches.Cast<Match>().Select(m => m.Value); 

를 사용하여 분할 시도 하지만
같은 출력을 얻고있다 [0] - 1; 2; 삼; 4; 5; 6; 7; SOI; 8; 9; 10; 11; 12;
[1] - 14; 15; 16; 17; 18;

더 나은 해결책을 제공해주십시오. 감사합니다

+2

당신은 중첩 된 SOI/EOI 구조를 추출하는 방법을 묻는? 나는 당신이 정규 표현식으로 그것을 할 수 있다면 놀랄 것이다. 값 목록을 처리하는 코드를 작성하는 것이 더 쉬울 것입니다. –

+1

잠깐,'[0] - 1; 2; 삼; 4; 5; 6; 7; 13; 출력으로? 그 13은'8; 9; 10; 11; 12; '다음 경기에 갈거야? –

답변

0

제가 정규식 대신에 절차 적으로 할 것이라고 생각합니다.

편집 : 다음 해결책은 실수가 있습니다. 첫 번째와 세 번째 목록은 동일합니다. 나는 그것이 올바른 방향의 힌트 일 수 있기 때문에 그것을 떠날 것이다.

1) 값을 0으로 설정하십시오.
2) 문자열에서 다음 토큰을 읽습니다.
3) 토큰이 SOI 인 경우 값
에 1을 더하십시오. 4) 토큰이 EOI 인 경우, 값
에서 1을 제거하십시오. 5) 토큰이 숫자 인 경우 Value에 따라 다른 배열 또는 목록에 추가하십시오.
6) GOTO 2

0
private static List<string> GetLists(string sText) 
    { 
     string[] output; 
     List<string> input = new List<string>(); 
     input = sText.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries).ToList(); 
     int count = input.Count(x => x == "SOI;"); 
     output = new string[count]; // set output array to number of lists in string 
     int current = -1; // start with -1 so first SOI will set it on 0 
     int max = -1; 
     foreach (var text in input) 
     { 
      if (text == "SOI;") // set current and max 
      { 
       current++; 
       max++; 
      } 
      else if (text == "EOI;") 
      { 
       current--; 
       if (current == -1) // if u reached -1 it means u are out of any list so set current on max so if u will get "SOI" u will get proper number 
       { 
        current = max; 
       } 
      } 
      else 
      { 
       output[current] += text; 
      } 
     } 

     return output.ToList(); 
    } 
} 
관련 문제