首页 > 解决方案 > 在 c# 中正确地将字符串转换为不规则 csv 的字典?

问题描述

我有一个从 aspx 页面上的用户输入返回的字符串。c# 代码的第一块工作得很好,我可以访问每个字典键值对。

string strsvresponse = "name:bob, age:22, city:Wolverhampton, state:West, Midlands, country:United Kingdom"
var dictusrdata = strsvresponse.Split(',')
.Select(x => x.Split(':'))
.ToDictionary(x => x[0], x => x[1]);

但是,细微的区别是另一个用户决定在状态字段中添加一个逗号,这会引发错误“索引超出数组范围”。

string strsvresponse = "name:bob, age:22, city:Wolverhampton, state:West, Midlands, UK, country:United Kingdom"
var dictusrdata = strsvresponse.Split(',')
.Select(x => x.Split(':'))
.ToDictionary(x => x[0], x => x[1]);

我无法阻止用户这样做,但是我想知道是否有更好的方法来编码字符串以获取键值对或访问字段:值数据?

谢谢G

标签: c#asp.netjsonlinq

解决方案


首先:您的格式不明确。使用众所周知且广泛支持的格式:CSV、JSON、XML 或更严格的格式。

如果你不能改变格式,你必须假设一些东西。让我们假设标签是由逗号和空格分隔的单个单词:

var regex = "\\w+:.*?(?=(, \\w+:|$))";
string strsvresponse =
    "name:bob, age:22, city:Wolverhampton, state:West, Midlands, UK, country:United Kingdom";

var dictusrdata = Regex.Matches(strsvresponse, regex)
    .OfType<Match>()
    .Select(a => a.Value.Split(':'))
    .ToDictionary(a => a[0], a => a[1]);

正则表达式\w+:.*?(?=(, \w+:|$))解释:

\w+ - any word
   : - followed by : (this is TAG)
    .*? - eat all chars lazily

(?= - lookahead assertion
   (
    , \w+: - make sure match is followed by [comma][space]TAG
   | - or
    $ - end of string
   )
) 

推荐阅读