2009-10-31 6 views
0

나는이 같은 중첩 된 그룹의 문자열이구문 분석 중첩 된 그룹

string Stream1 = @"group ""Main"" 
          bla 
          bla 
           group ""Sub1"" -- block-group 
           var1 
           var2 
           endgroup -- block-group ""Sub1"" 
           bla 
           bla 
           group ""Sub2"" -- block-group 
           var1 
           endgroup -- block-group ""Sub2"" 
           bla 
           group ""Sub3"" -- block-group 
           var1 
           var2 
           var3 
            group ""SubSub31"" -- block-group 
            var10 
            var20 
            endgroup -- block-group ""SubSub31"" 
           endgroup -- block-group ""Sub3"" 
          endgroup"; 

예상 출력이

같은 GroupObjects의 목록입니다 ('blabla'는 무시해야하는 문자열 내의 텍스트입니다)
public class GroupObject 
    {  
     public string GroupName = ""; // Example: SubSub31 
     public string GroupPath = ""; // Example: Main/Sub3/SubSub31 
     public List<Var> LocalVar = new List<VarBloc();//Var10,var20 
    } 

일부 재귀 정규식이 해결할 것 같아요. 그러나이 작업을 수행하는 방법을 알아낼 수 없습니다.

누군가 내게 힌트를 줄 수 있습니까?

샘플 코드는 높게 평가 될 것이다

답변

0

문제가 해결 될 수 재귀 정규 표현식 -하지만 쉽게 유지 보수가 너무 높을 수의 복잡성을 (내가 한 번 구현 사람으로 말하고 정규 판매 표현 엔진).

저는 이 아닙니다.은 완벽한 해결책을 제공하지는 않지만 여기에서 문제를 해결할 수있는 방법 중 하나입니다.

public class Group 
{  
    public string Name { get; set; } 
    public string GroupPath { get; set; } 
    public IEnumerable<VarBlock> Variables { get; } 
    public IEnumerable<Group> NestedGroups { get; } 
} 

사용자의 입력 스트림을 가정

(대신 공용 멤버의 특성 참고 사용) 기반의 라인은 다음과 같습니다

귀하의 출력 객체, 중첩 된 그룹에 대해 이런 일을 할 수 있도록 변경해야 그룹을 구문 분석, 그리고

public Queue<string> GetLines(string definition) { ... } 

루틴을 만들 : 형식, 라인에 문자열을 분할 함수를 작성

public Group ParseGroup(Queue<string> lines) { ... } 
  • 이 루틴은 그룹의 시작을 발견하면 재귀 적으로 중첩 된 그룹을 분석 한 후 NestedGroups에 결과를 추가하는 자신을 호출해야합니다.
  • 이 루틴이 그룹의 끝을 발견하면 블록 어셈블 링을 완료하고 오브젝트를 리턴해야합니다.

희망이 있으면 도움이됩니다.

+0

감사합니다. 나는 시도 할 것이다. – tomfox66

0

다양한 반 구조화 된 문서를 구문 분석하기 위해 개발 된 ANTLR (http://www.antlr.org/)을 권장합니다. 지상에서 내려 줄 책 (The Definitive ANTLR Reference)이 있습니다. Java 및 C#과 같은 언어에 대한 완벽한 파서를 제공 할 수 있습니다. 이 필요한 데이터 구조로 결과를 처리 할 수 ​​있도록 (Java) 코드를 파서에 포함시킬 수 있습니다.

관련 문제