提取字符串的一部分

时间:2009-02-12 04:12:14

标签: c#

我有一个收藏品。 coll有字符串:

Location="Theater=2, Name=regal, Area=Area1"

等等。我必须从字符串中提取名称位。例如,在这里我必须提取文本'regal'

我正在努力解决这个问题:

Collection.Location。???? (这里要添加什么)

哪种方法最简短,最精确?

[编辑]:如果我必须添加到GroupBy子句

,该怎么办?

Collection.GroupBy(????);

5 个答案:

答案 0 :(得分:3)

扩展保罗的回答:

var location = "Theater=2, Name=regal, Area=Area1";

var foo = location
    .Split(',')
    .Select(x => x.Split('='))
    .ToDictionary(x => x[0].Trim(), x => x[1]);

Console.WriteLine(foo["Name"]);

这会将原始字符串填充到字典中以便于参考。再次,没有错误检查或任何事情。

答案 1 :(得分:2)

Location.Split(",").Select(x => x.Split("=")[1])

这是非常懒惰,完全没有错误处理的方式:)

答案 2 :(得分:2)

快速而肮脏的方式是简单的IndexOf / Substring提取:

string location = "Theater=2, Name=regal, Area=Area1";

int startPos = location.IndexOf("Name=") + 5;
int endPos = location.IndexOf(",", startPos);

string name = location.Substring(startPos, endPos - startPos);

答案 3 :(得分:2)

如果Regex是一个选项,您可以使用环视构造来获得精确匹配。我在下面使用的示例应该在c#中运行良好。关于这一点的好处是,即使在名称部分之前添加了更多以逗号分隔的项目,它仍将继续工作。

    System.Text.RegularExpressions.Match m =
        System.Text.RegularExpressions.Regex.Match(
            "Theater=2, Name=regal, Area=Area", @"(?<=Name=)[a-zA-Z0-9_ ]+(?=,)");
    Console.WriteLine(m.Value);

答案 4 :(得分:1)

另一种LINQ风格的答案(没有字典的开销):

var name = (from part in location.Split(',')
            let pair = part.Split('=')
            where pair[0].Trim() == "Name"
            select pair[1].Trim()).FirstOrDefault();

重新分组(编辑):

    var records = new[] {
        new {Foo = 123, Location="Theater=2, Name=regal, Area=Area1"},
        new {Foo = 123, Location="Name=cineplex, Area=Area1, Theater=1"},
        new {Foo = 123, Location="Theater=2, Area=Area2, Name=regal"},
    };
    var qry = from record in records
              let name = (from part in record.Location.Split(',')
                          let pair = part.Split('=')
                          where pair[0].Trim() == "Name"
                          select pair[1].Trim()).FirstOrDefault()
              group record by name;
    foreach (var grp in qry)
    {
        Console.WriteLine("{0}: {1}", grp.Key, grp.Count());
    }