C#正则表达式提取多个结构键值
Posted
技术标签:
【中文标题】C#正则表达式提取多个结构键值【英文标题】:C# regex to extract multiple structure key value 【发布时间】:2021-11-04 21:10:04 【问题描述】:我找到了一些正则表达式来提取键值样式格式
但最近我遇到了一些类似下面的格式
"Key1"=123,"Key2"="abc","key3"="subkey1"=12,"subkey2"="cd","key4"=456
这是我想要输出的内容
match | Key | value |
---|---|---|
match0 | Key1 | 123 |
match1 | Key2 | "abc" |
match2 | key3 | "subkey1"=12,"subkey2"="cd" |
match3 | key4 | 456 |
我怎样才能逃避 中的“,”
我试过了
"(?<key>\w+)"=(?<value>?"?[^,]*"??)
但是 结果是这样的
match | Key | value |
---|---|---|
match0 | Key1 | 123 |
match1 | Key2 | "abc" |
match2 | key3 | "subkey1"=12 |
match3 | subkey2 | "cd" |
match4 | key4 | 456 |
只有当 中的 "," 时才能转义?
【问题讨论】:
有很多问题讨论如何使用正则表达式解析任意嵌套结构...包括the most famous one。您期望嵌套结构更容易的任何特殊原因?请edit 澄清是什么使您的案例适合正则表达式解析的问题。 我对正则表达式的个人指导方针:不要使用它们 - 除非 a) 实现很简单或 b) 你绝对有 到。我怀疑你会为你想要实现的目标找到一个简单且可维护的解决方案。尝试构建解析器。如果他们可以给你一些指示 - 甚至是现成的方法,也许可以与创建输出的人交谈。毕竟,它基本上看起来像 JSON,除了=
替换 :
(并且缺少周围的括号)
感谢两位推荐,是的,也许应该尝试构建一个解析器而不是使用正则表达式。
@Lovetakingphoto 请注意,如果您想实现 json 方法 - 您需要考虑 =
存在于字符串值内的可能性,尽管编写简单的解析器将替换所有 =
不在引号内比写一个成熟的更容易。
【参考方案1】:
在样本数据上"(?<key>\w+)"=(?<value>(.*?)|"?[^,]*"?)
似乎to work fine - 在花括号中的值和您当前拥有的模式之间交替,尽管只要您只有一层嵌套它就可以工作。
另外,根据提供的数据,我会考虑通过将=
替换为:
将字符串转换为json 的方法(除非某些值可以具有=
- 然后会更难,尽管编写简单的解析器来替换所有不在引号内的=
应该比编写完全成熟的引号更容易)并将所有内容包装在花括号中并反序列化结果。
【讨论】:
【参考方案2】:你可以试试这个:
,(?=[^]*(?:,|$))
这不会考虑大括号内的,
Demo
来源(run here):
string pattern = @",(?=[^]*(?:,|$))";
string input = @"""Key1""=123,""Key2""=""abc"",""key3""=""subkey1""=12,""subkey2""=""cd"",""key4""=456";
string[] result = Regex.Split(input, pattern,
RegexOptions.IgnoreCase,
TimeSpan.FromMilliseconds(500));
for (int ctr = 0; ctr < result.Length; ctr++)
Console.WriteLine("'0'", result[ctr]);
【讨论】:
【参考方案3】:您输入的数据似乎是几乎有效的 JSON。
这对我有用:
string source = @"""Key1""=123,""Key2""=""abc"",""key3""=""subkey1""=12,""subkey2""=""cd"",""key4""=456";
string json = $"source.Replace("=", ":")";
// "Key1":123,"Key2":"abc","key3":"subkey1":12,"subkey2":"cd","key4":456
var result = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
这给了我:
【讨论】:
以上是关于C#正则表达式提取多个结构键值的主要内容,如果未能解决你的问题,请参考以下文章