如何从字符串中获取字符串,以特定字符串

时间:2017-06-06 21:34:07

标签: c# .net string .net-4.5

我有一个包含类似文字的字符串,如下所示

Name: John\n Surname: Smith\n Address: XXX\n

它可以以不同的顺序出现。

我想获取名称值,姓氏值和地址值。

所以问题是:如何从字符串“Name:”开始并在“\ n”之前结束字符串,所以我得到“John”并且代码非常易读?

我尝试使用Substring函数,但它需要对字符串进行修改,以便获得“\ n”部分的正确索引。我宁愿不修改原始字符串,因此它更具可读性。

3 个答案:

答案 0 :(得分:3)

您可以将此字符串转换为字典(即键值对的集合)。首先将换行符的初始字符串拆分为字符串数组。然后,来自此数组的每个字符串由冒号分为两部分 - 键和值:

var input = "Name: John\n Surname: Smith\n Address: XXX\n";
var dictionary = input.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
                      .Select(s => s.Split(':'))
                      .ToDictionary(p => p[0].Trim(), p => p[1].Trim());

然后按键读取值:

var name = dictionary["Name"]; // gives you John

注意:如果允许地址或其他字段包含冒号,则可以在选择字典值时使用@Joel Coehoorn的注释中的string.Join选项。

或者您可以使用正则表达式而不是拆分和连接字符串。只需在输入中找到模式匹配项:

var input = "Name: John\n Surname: Sm:ith\n Address: XX:X\n";
var dictionary = Regex.Matches(input, @"\s*([^:]+): ([^\n]+)\n").Cast<Match>()
                      .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);
var address = dictionary["Address"]; // XX:X

答案 1 :(得分:1)

我会在这些类型的情况下使用Regex有两个原因:

  1. 在这些情况下维护它更容易。当函数的作用增加时,SubstringSplitIndexof很容易复杂化。
  2. 为未来的变化提供更大的灵活性
  3. 以下是解析它的代码:

    static string ExtractParam(string input, string arg) {
        var match = Regex.Match(input, $@"\b{arg}:\s*(.*?)\n");
        return match.Success ? match.Groups[1].Value : null;
    }
    
    static void Main() {
        var input = "Name: John\n Surname: Smith\n Address: XXX\n";
    
        var name = ExtractParam(input, "Name");
        var surname = ExtractParam(input, "Surname");
        var address = ExtractParam(input, "Address");
    
        Console.WriteLine($"Name: {name}\n Surname: {surname}\n Address: {address}\n");
    }
    

    正则表达式很容易理解。

    \b   : Match a word boundary
    \s*  : Eat up any unwanted whitespace
    .*?  : Match any string in a non-greedy way
    ()   : Parenthesis are used to capture what we want to return
    

答案 2 :(得分:0)

@Vikhram的答案非常好:)

我要给你其他想法。 我的程序有点不同,它找到所有索引,其中字符串包含&#34; n&#34; ,这将打印最后一个< em>&#34; \ n&#34; 到&#34; \ n&#34;

        string test = "Name: John\n Surname: Smith\n Address: XXX\n";

        int fst_index = test.IndexOf("\n");
        int snd_index = test.IndexOf("\n", fst_index+1);
        int trd_index = test.IndexOf("\n", snd_index+1);

        Console.WriteLine(test.Substring(fst_index, snd_index-fst_index));
        Console.WriteLine("SPACE ?");

        Console.WriteLine(test.Substring(snd_index, trd_index - snd_index));
        Console.WriteLine("SPACE ?");

如果您要使用长文本,则必须使用循环。