正则表达式替换在 JSON 结构上

本文关键字:结构上 JSON 替换 正则表达式 | 更新日期: 2023-09-27 18:36:33

我目前正在尝试对如下所示的 JSON 字符串进行正则表达式替换:

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''":''"猴子"作为匹配并替换它。我想像替换字符串上的单个匹配项一样替换match.Group[1]

归根结底,JSON 字符串需要如下所示:

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

知道怎么做吗?

正则表达式替换在 JSON 结构上

你想要一个积极的前瞻和一个积极的后视:

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

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

从 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"

从@Jonesy的答案出发,我得到了这个适合我想要的东西。它包括 .替换我需要的组。前视和后视非常有趣,但我需要替换其中一些值,因此组。

    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的巨大帮助。