2009-10-31 3 views
0

У меня есть строка с вложенными группами, как этот («BlaBla» некоторый текст в строке, которые должны быть проигнорированы)Разбор вложенных групп

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 как этот

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

Рекурсивное регулярное выражение может решить эту проблему - но сложность может быть слишком высокими, чтобы легко поддерживать (и я говорю как человек, который когда-то реализованный и продал Regular Expression engine).

Я не, чтобы дать вам полное решение, но вот один из способов решения проблемы.

Ваш выход объекта необходимо изменить, чтобы для вложенных групп, что-то вроде этого:

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) код в синтаксический анализатор, который позволит вам обрабатывать результаты в структурах данных, которые вам нужны.