在字符串中获取字符串括号索引并拆分内容

时间:2013-10-12 06:59:21

标签: c# regex split

这是我当前字符串的样子:

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

它也可能看起来像这样

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

我需要的是一种搜索整个字符串并能够获得的方法:

搜索数据,然后在第一个和最后一个括号之间获取整个数据 数据= {获取此}

然后,根据获得的数据,我应该能够得到:

Person,Id,那么如果我发现规范与数据相同,则将内容放到最后一个括号内,然后对目标执行相同操作。

任何线索我该怎么办?我正在使用C#。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

所以现在你可以迭代数组并解析数据。基本逻辑将是

if(arr [i] ==“Data”)然后接下来的两个项目是person和id

如果(arr [i] ==“目的地”)则接下来的两个项目将是id和目的地

if(arr [i] ==“specification”)然后接下来的两个项目是国家和价格