在C#中解析此字符串的最佳方法是什么?

leo*_*ora 24 .net c# string parsing

我有一个字符串,我正在从另一个系统中读取.它基本上是一个长字符串,表示由两者之间的空格分隔的键值对列表.它看起来像这样:

 key:value[space]key:value[space]key:value[space]
Run Code Online (Sandbox Code Playgroud)

所以我编写了这段代码来解析它:

string myString = ReadinString();
string[] tokens = myString.split(' ');
foreach (string token in tokens) {
     string key = token.split(':')[0];
     string value = token.split(':')[1];
     .  . . . 
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是一些值中有空格,所以我在顶部的"简单"分裂不再有效.我想知道如何解析键值对的列表(给定空格作为分隔符)现在我知道值字段中也可能有空格,因为拆分看起来不像它能够工作了.

注意:我现在确认KEYs中没有空格,所以我只需要担心这些值.为混乱道歉.

Epi*_*dex 22

使用此正则表达式:

\w+:[\w\s]+(?![\w+:])
Run Code Online (Sandbox Code Playgroud)

我测试了它

test:testvalue test2:test value test3:testvalue3
Run Code Online (Sandbox Code Playgroud)

它返回三个匹配:

test:testvalue
test2:test value
test3:testvalue3
Run Code Online (Sandbox Code Playgroud)

您可以更改\w为输入中可能出现的任何字符集.

测试代码:

var regex = new Regex(@"\w+:[\w\s]+(?![\w+:])");
var test = "test:testvalue test2:test value test3:testvalue3";

foreach (Match match in regex.Matches(test))
{
    var key = match.Value.Split(':')[0];
    var value = match.Value.Split(':')[1];

    Console.WriteLine("{0}:{1}", key, value);
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

正如桑科所指出的那样,这个正则表达式将会失败:.如果您预测到这种情况,请使用\w+:[\w: ]+?(?![\w+:])正则表达式.当冒号value前面有空格时,这仍然会失败...我会考虑解决这个问题.

  • "任何足够先进的正则表达都与魔法无法区分";) (15认同)

Car*_*rra 5

如果不将您从空格的分割更改为其他内容(例如"|"),则无法使用此功能.

考虑一下:

Alfred Bester:Alfred Bester Alfred:Alfred Bester

  • 这把钥匙"Alfred Bester"和价值Alfred"或Key"Alfred"和价值"Bester Alfred"?