2017-06-06 147 views
1

我已经得到了含有类似的文字像下面如何从一个字符串得到一个字符串,开始和一个特定的字符串

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

它可以在不同的顺序出现的字符串结束。

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

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

我试过使用Substring函数,但它需要对字符串进行操作,所以我得到了“\ n”部分的正确索引。而且我不想修改原始字符串,因此它更具可读性。

+0

*我试图使用Substring函数* - 你可以添加你试过的代码吗?并澄清什么*它可以以不同的顺序出现*意味着 –

+0

什么版本的C#/ .Net? –

+0

最简单的方法是使用'String'类的'Split'方法,使用分隔符''\ n'' ..... – t0mm13b

回答

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 
+0

对于该值,可能是'string.Join(“:”,p.Skip(1).ToArray())',以说明可能在值中包含冒号的地址或其他项目。 –

+0

@JoelCoehoorn同意,地址可以包含冒号'string.Join(“:”,p.Skip(1))'将完成这项工作。谢谢 –

+0

我不确定在哪里使用“string.Join(”:“,p.Skip(1))”行 –

1

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

  1. 这是比较容易保持它在这些情况下。当函数的作用增加时,Substring,Split,Indexof容易变得复杂。
  2. 它提供了更多的灵活性,为未来的改变

下面是分析它的代码:

static string ExtractParam(string input, string arg) { 
    var match = Regex.Match(input, [email protected]"\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 
0

@Vikhram的答案是非常好的:)

,我去给你其他的想法。 我的程序的工作方式有些不同,它会发现所有的指数法在字符串中包含“N”,而这会从最后打印字符串“\ n”“\ n”

 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 ?"); 

如果你打算在长文本中使用它,你必须使用循环。

相关问题