【问题标题】:C# regex to extract multiple structure key valueC#正则表达式提取多个结构键值
【发布时间】: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 方法 - 您需要考虑 = 存在于字符串值内的可能性,尽管编写简单的解析器将替换所有 = 不在引号内比写一个成熟的更容易。

标签: c# regex


【解决方案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);
      

      这给了我:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        相关资源
        最近更新 更多