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】:

在样本数据上"(?&lt;key&gt;\w+)"=(?&lt;value&gt;(.*?)|"?[^,]*"?) 似乎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#正则表达式提取多个结构键值的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从文件中提取 JSON 键值映射

使用 ruby​​ 和正则表达式从字符串中提取键值对

c# 正则表达式提取()中的值

具有多个捕获组的 R 中的正则表达式组捕获

c#使用正则表达式提取内容

C#怎么用正则表达式提取链接和图片标签的属性