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