Разбор вложенного текста в C # - PullRequest
1 голос
/ 12 октября 2010

Если у меня есть ряд строк, которые имеют этот базовый формат:

"[id value]"//id and value are space delimited.  id will never have spaces

Затем они могут быть вложены следующим образом:

[a]
[a [b value]]
[a [b [c [value]]]

Таким образом, каждый элемент может иметь значения 0 или 1.

Как лучше всего разбирать этот формат? Я просто использую такие вещи, как string.Split () или string.IndexOf () или есть лучшие методы?

Ответы [ 4 ]

2 голосов
/ 12 октября 2010

Нет ничего плохого в методах split и indexof, они существуют для разбора строк. Вот пример для вашего случая:

        string str = "[a [b [c [d value]]]]";

        while (str.Trim().Length > 0)
        {
            int start = str.LastIndexOf('[');
            int end = str.IndexOf(']');

            string s = str.Substring(start +1, end - (start+1)).Trim();
            string[] pair = s.Split(' ');// this is what you are looking for. its length will be 2 if it has a value

            str = str.Remove(start, (end + 1)- start);
        }
2 голосов
/ 12 октября 2010

Сработает небольшая рекурсия и разбиение, главное - использовать рекурсию, это сделает ее намного проще.Ваш входной синтаксис выглядит примерно так: LISP:)

Parsing a, split, no second part. done.
Parsing a [b value]. has second part, go to the beginning.
...

Вы поняли.

1 голос
/ 12 октября 2010

Regex всегда хорошее решение.

string test = "[a [b [c [value]]]";
Regex r = new Regex("\\[(?<id>[A-Za-z]*) (?<value>.*)\\]");
var res = r.Match(test);

Затем вы можете получить значение (которое составляет [b [c [value]] после первой итерации) и применить его снова, пока совпадение не завершится.

string id = res.Groups[1].Value;
string value = res.Groups[2].Value;
0 голосов
/ 12 октября 2010

Простой сплит должен работать Для каждого id есть одна скобка [
Поэтому, когда вы разделяете эту строку, у вас есть n-скобок , поэтому n-1 id (s), где последний элемент содержит значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...