c# - 在 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
解决方案
首先:您的格式不明确。使用众所周知且广泛支持的格式: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
)
)
推荐阅读
- reactjs - 在对 React 应用程序的请求中阅读帖子正文
- python - Python 与 Excel 的集成
- javascript - 当您按下“Enter”时,应在另一个元素的末尾创建一个元素
- flutter - 我使用 ADB 运行颤振应用程序,但该应用程序未显示在菜单中
- amazon-web-services - 无法测试基于 AWS Cognito 的用户注册和登录
- sql-server - SQL Server 到服务总线
- listview - SwiftUI:删除列表视图左右的空间?
- powershell - 在两个非常大的列表中查找不同之处
- node.js - 如何使用 API 路由在 Next.js 上下载文件
- c# - UWP - “System.IO.IOException:'网络访问被拒绝:'......”