2013-10-12 2 views
0

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

Data={Person, Id, Destination={Country, Price}} 

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

Data={Person, Id, Specification={Id, Destination={Country, Price}}} 

Что мне нужно, это способ для меня для поиска по всей цепочке и получения:

Искать Данные, а затем получить все данные между первым и d последний последний кронштейн Data = {GET THIS}

Затем с данными, полученными я должен быть в состоянии получить:

Person, Id, а затем, если я найду Specification сделать то же самое, как с данными, получить содержимое внутри до последней скобки, и сделайте то же самое для Destination.

Любые подсказки, что мне делать? Я использую C# для этого.

+1

Непохоже, данные JSON вообще, если возможно, вы имеете в виду, что она так же содержит фигурные скобки , Библиотека JSON здесь не поможет. –

+0

Не существует ли способа получить первый индекс скобок и последний индекс внутри строки, а затем получить все данные между этими индексами? И сделать то же самое для любого другого кронштейна внутри скобки? –

+0

Похоже, вам просто нужно снять первые шесть и последние персонажи ... это все, что вам нужно? –

ответ

0

Вы могли бы попробовать что-то вроде этого -

string str = "Data={Person, Id, Specification={Id, Destination={Country, Price}}}"; 
string[] arr = str.Split(new char[]{'{','}','=',','},StringSplitOptions.RemoveEmptyEntries).Where(x => x.Trim().Length != 0).Select(x => x.Trim()).ToArray(); 
foreach(string s in arr) 
    Console.WriteLine(s); 

Where(x => x.Trim().Length != 0) часть используется для удаления строк, содержащих только пробелы.

Select(x => x.Trim()) часть используется для удаления ведущих и конечных пробелов всех подстрок.

результат выходит быть

Data 
Person 
Id 
Specification 
Id 
Destination 
Country 
Price 

так что теперь вы можете перебирать массив и анализировать данные.Основная логика была бы

если (обр [я] == «Data»), то следующие два пункта будет человек и идентификатор

если (обр [я] == «Destination»), то следующие два пункта быть идентификатор и назначения

если (обр [я] == «спецификация»), то следующие два пункта будет страна и цена

+0

Спасибо за вашу помощь, но есть что-то Я хотел бы спросить, код, который вы предоставили, действительно работает так, как мне это нужно, но есть способ, который, например, мои данные: Data = (Id Specification = ANYTHING, id) Я имею в виду, иметь возможность получить весь текст if после Id нет запятой, которая не находится внутри символа пробела, но получает пробел, пока он не попадет в скобку или запятую? –

+0

@ RaúlSanpedro, я думаю, что ваша проблема больше связана с поиском соответствующих скобок, а затем анализируя данные между ними. Проверьте это [ссылка] (http://stackoverflow.com/questions/12752225/how-do-find-the-position-of-matching-parentheses-or-braces-in-a -given-of-of), в котором обсуждается, как найти соответствующие скобки. – th1rdey3

1

Функция для извлечения все между фигурными скобками:

public string retrieve(string input) 
{ 
    var pattern = @"\{.*\}"; 
    var regex = new Regex(pattern); 
    var match = regex.Match(input); 
    var content = string.Empty; 
    if (match.Success) 
    { 
     // remove start and end curly brace 
     content = match.Value.Substring(1, match.Value.Length - 2); 
    } 
    return content; 
} 

Затем с помощью функции извлечения содержимого:

var input = @"Data={Person, Id, Specification={Id, Destination={Country, Price}}}"; 
var content = retrieve(input); 
Console.Out.WriteLine(content); 
if (!string.IsNullOrEmpty(content)) 
{ 
    var subcontent = retrieve(content); 
    Console.Out.WriteLine(subcontent); 
    // and so on... 
} 

Выход является:

Person, Id, Specification={Id, Destination={Country, Price}} 
Id, Destination={Country, Price} 

Вы не можете использовать string.Split (',') для извлечения Лицо и Id, потому что оно также разделило бы строки между скобками, и вы не захотите этого. Вместо того, чтобы использовать в качестве предложенной String.indexOf два раза от правильного положения, и вы будете правильно иметь подстроки:

// TODO error handling 
public Dictionary<string, string> getValues(string input) 
{ 
    // take everything until =, so string.Split(',') can be used 
    var line = input.Substring(0, input.IndexOf('=')); 
    var tokens = line.Split(','); 
    return new Dictionary<string, string> { { "Person" , tokens[0].Trim() }, { "Id", tokens[1].Trim() } }; 
} 

Функция должна быть использована на извлеченном содержания:

var input = @"Data={Person, Id, Specification={Id, Destination={Country, Price}}}"; 
var content = retrieve(input); 
var tokens = getValues(content); 
Console.Out.WriteLine(string.Format("{0} // {1} // {2}", content, tokens["Person"], tokens["Id"])); 
if (!string.IsNullOrEmpty(content)) 
{ 
    var subcontent = retrieve(content); 
    Console.Out.WriteLine(subcontent); 
    var subtokens = getValues(subcontent); 
    Console.Out.WriteLine(string.Format("{0} // {1} // {2}", subcontent, subtokens["Person"], subtokens["Id"])); 
} 

И выход является:

Person, Id, Specification={Id, Destination={Country, Price}} // Person // Id 
Id, Destination={Country, Price} 
Id, Destination={Country, Price} // Id // Destination 
Смежные вопросы