正则表达式替换JSON结构

时间:2013-10-22 12:49:54

标签: c# regex json

我目前正在尝试对JSON字符串执行Regex Replace,如下所示:

String input = "{\"`####`Answer_Options11\": \"monkey22\",\"`####`Answer_Options\": \"monkey\",\"Answer_Options2\": \"not a monkey\"}";

一 目标是找到并替换关键字段以`####`

开头的所有值字段

我目前有这个:

static Regex _FieldRegex = new Regex(@"`####`\w+" + ".:.\"(.*)\",");

static public string MatchKey(string input)
{
    MatchCollection match = _encryptedFieldRegex.Matches(input.ToLower());
    string match2 = "";
    foreach (Match k in match )
    {
        foreach (Capture cap in k.Captures)
        {
            Console.WriteLine("" + cap.Value);
            match2 = Regex.Replace(input.ToLower(), cap.Value.ToString(), @"CAKE");
        }
    }

    return match2.ToString();
}

现在这不起作用。当然我猜是因为它拿起整个`####`Answer_Options11 \“:\”monkey22 \“,\”`####`Answer_Options \“:\”monkey \“,作为匹配并替换它。我想像对待字符串上的单个匹配一样替换match.Group[1]

在一天结束时,JSON字符串需要看起来像这样:

String input = "{\"`####`Answer_Options11\": \"CATS AND CAKE\",\"`####`Answer_Options\": \"CAKE WAS A LIE\",\"Answer_Options2\": \"not a monkey\"}";

知道怎么做吗?

2 个答案:

答案 0 :(得分:2)

你想要一个积极的前瞻和积极的外观:

(?<=####.+?:).*?(?=,)

前瞻和后瞻将验证它是否与这些模式匹配,但不包括在匹配中。 This site很好地解释了这个概念。

RegexHero.com生成的代码:

string strRegex = @"(?<=####.+?:).*?(?=,)";
Regex myRegex = new Regex(strRegex);
string strTargetString = @" ""{\""`####`Answer_Options11\"": \""monkey22\"",\""`####`Answer_Options\"": \""monkey\"",\""Answer_Options2\"": \""not a monkey\""}""";

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
     // Add your code here
  }
}

这将匹配"monkey22""monkey",但不匹配"not a monkey"

答案 1 :(得分:-1)

根据@Jonesy的回答,我得到了这个符合我想要的东西。它包括我需要的组的.Replace。前景和后方的负面看法非常有趣,但我需要替换其中一些价值观,因此需要进行分组。

    static public string MatchKey(string input)
    {

       string strRegex = @"(__u__)(.+?:\s*)""(.*)""(,|})*";
        Regex myRegex = new Regex(strRegex, RegexOptions.IgnoreCase | RegexOptions.Multiline);
        IQS_Encryption.Encryption enc = new Encryption();

        int count = 1;

        string addedJson = "";

        int matchCount = 0;
        foreach (Match myMatch in myRegex.Matches(input))
        {

            if (myMatch.Success)
            {
                //Console.WriteLine("REGEX MYMATCH: " + myMatch.Value);
                input = input.Replace(myMatch.Value, "__e__" + myMatch.Groups[2].Value + "\"c" +  count + "\"" + myMatch.Groups[4].Value);
                addedJson += "c"+count + "{" +enc.EncryptString(myMatch.Groups[3].Value, Encoding.UTF8.GetBytes("12345678912365478912365478965412"))+"},";
            }

            count++;
            matchCount++;
        }
        Console.WriteLine("MAC" + matchCount);
        return input + addedJson;
    }`

再次感谢@Jonesy提供的巨大帮助。