【问题标题】:String replace with substring字符串替换为子字符串
【发布时间】:2017-04-24 21:08:33
【问题描述】:

我有一个字符串如下。

{{"sId":"HSFJFKJ.dsfhshd","min":"AKK213AD23456","info":"text"},
{"sId":"HSFJFKJ.dsd7shd","min":["BKK213ACD23456","BKK213AB1CD23456"],"info":"text"},
{"sId":"HSFJFKJ.dsdf7shd","min":"BKK213AB1CD23456","info":"text"},
{"sId":"HSFJFKJ.dsdd7shd","min":"CKK213AB1CD23456","info":"text"}}

如果您看到“min”值有时是单一的,有时是重复的。 因此,我想删除这种“min”值的重复。它必须是单个值。

所以我想解析完整的字符串(非常长的字符串),并查找“min​​”是否有多个值。如果它有多个值,则将其替换为单个值。

示例:

替换:

"min":["BKK213AB1CD23456","BKK213AB1CD23456"] 

与:

"min":"BKK213AB1CD23456"

在 C# 中寻找任何简单的解决方案。

【问题讨论】:

  • 你是否总是用方括号表示 min 的值,即使它是单个元素?
  • 只有当多个值存在时,我们才有方括号
  • 您的格式不一致。您可以解决重复问题,但您的格式需要保持一致。
  • 对不起,我刚刚更新了...

标签: c# json regex


【解决方案1】:

这是一个直接的正则表达式解决方案。任何单个“最小”值都将被单独保留,而倍数将减少到第一个值。

Regex.Replace(input, "\"min\":\\[(\"[A-Z\\d]+\").+?\\]", "\"min\":$1");

细分:

  • \[\] 匹配文字括号
  • ("[A-Z\d]+") 匹配引号中的字符串并捕获组
  • .+? 匹配右括号前的所有其他内容(惰性匹配)
  • 在替换中,$1 引用捕获组

regex101上查看我的解决方案

【讨论】:

    【解决方案2】:

    如下创建一个类

    public class Data
    {
        public int SId { get; set;}
        public HashSet<string> hashsetMinValues { get; set;}
        public string Info { get; set;}
    
        public List<Data> ReadData()
        {
            //Read you object in list of data i.e List<Data>
        }
    }
    

    当您在哈希集中添加min 值时,哈希集将自行删除重复值

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我认为这是你能做的最好的..

      void Main()
      {
          var inputStr = @"[{'sId':'HSFJFKJ.dsfhshd','min':'AKK213AD23456','info':'text'},
          {'sId':'HSFJFKJ.dsd7shd','min':['BKK213AB1CD23456','BKK213AB1CD23456'],'info':'text'},
          {'sId':'HSFJFKJ.dsdf7shd','min':'BKK213AB1CD23456','info':'text'},
          {'sId':'HSFJFKJ.dsdd7shd','min':'CKK213AB1CD23456','info':'text'}]";
      
          inputStr = inputStr.Replace("'min':'","'min':['").Replace("','info'","'],'info'");
      
          var dest = JsonConvert.DeserializeObject<test[]>(inputStr);
      
          var finalList = dest.Select(d => new test() { sId=d.sId,min=d.min.Distinct().ToArray(),info=d.info });
      
          //This will have your final string
          var output = JsonConvert.SerializeObject(finalList);
      
      }
      
      // Define other methods and classes here
      public class test
      {
          public string sId { get; set; }
          public string[] min { get; set; }
          public string info { get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-23
        • 1970-01-01
        • 2012-04-03
        • 2013-07-23
        • 2018-03-26
        • 2019-04-15
        相关资源
        最近更新 更多