我有一个包含类似文字的字符串,如下所示
Name: John\n Surname: Smith\n Address: XXX\n
它可以以不同的顺序出现。
我想获取名称值,姓氏值和地址值。
所以问题是:如何从字符串“Name:”开始并在“\ n”之前结束字符串,所以我得到“John”并且代码非常易读?
我尝试使用Substring函数,但它需要对字符串进行修改,以便获得“\ n”部分的正确索引。我宁愿不修改原始字符串,因此它更具可读性。
答案 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
有两个原因:
Substring
,Split
,Indexof
很容易复杂化。以下是解析它的代码:
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 ?");
如果您要使用长文本,则必须使用循环。