字符串替换为子字符串

时间:2016-12-09 11:34:16

标签: c# json regex

我有一个字符串如下。

{{"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":["BKK213AB1CD23456","BKK213AB1CD23456"] 

使用:

"min":"BKK213AB1CD23456"

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

3 个答案:

答案 0 :(得分:1)

这是一个直接的正则表达式解决方案。任何单个“min”值都将保持不变,而倍数将减少到第一个值。

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

<强>故障:

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

regex101

上查看我的解决方案

答案 1 :(得分:0)

将课程设为以下

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>
    }
}

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

希望这有帮助。

答案 2 :(得分:0)

我认为这是你能做的最好的事情。

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; }
}