Разбор вложенного текста в C#

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

"[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 ответа

Решение

В методах 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);
        }

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

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

Вы поняли идею.

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;

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

Другие вопросы по тегам