使用正则表达式从字符串中提取json数据

本文关键字:提取 json 数据 字符串 正则表达式 | 更新日期: 2023-09-27 18:13:22

我的数据字符串如下:

....
data=[{"CaseNo":1863,"CaseNumber":"RD14051315","imageFormat":"jpeg","ShiftID":241,"City":"Riyadh","ImageTypeID":2,"userId":20}]
--5Qf7xJyP8snivHqYCPKMDJS-ZG0qde4OqIyIG
Content-Disposition: form-data
.....

我想从上面的字符串获取json数据。我如何使用正则表达式找到字符串的那一部分?我试图找到indexOf("data=[")和indexOf("}]"),但它不能正常工作和正确的方式。

使用正则表达式从字符串中提取json数据

只是想添加一个更复杂的正则表达式,可以处理多个json对象(嵌套对象)在一个文本。发现了许多使用递归的正则表达式,但由于这不是。net的选项,而且我在任何地方都没有找到提供解决方案的答案,所以我想在这里分享一下。

(?<json>{(?:[^{}]|(?<Nested>{)|(?<-Nested>}))*(?(Nested)(?!))})

Regex101例子

我们可以使用平衡组来代替许多其他语言所利用的递归。我们基本上要做的是计算json对象中左括号的数量和右括号的数量,如果有任何剩余的左括号没有匹配右括号,我们就拒绝捕获(通过负查找)。

我不完全确定是否有更好的方法来做到这一点,但是下面的regex字符串应该为您提供所需的数据:

// Define the Regular Expression, including the "data="
// but put the latter part (the part we want) in its own group
Regex regex = new Regex(
    @"data=('[{.*}'])",
    RegexOptions.Multiline
);
// Run the regular expression on the input string
Match match = regex.Match(input);
// Now, if we've got a match, grab the first group from it
if (match.Success)
{
    // Now get our JSON string
    string jsonString = match.Groups[1].Value;
    // Now do whatever you need to do (e.g. de-serialise the JSON)
    ...
    }
}

在嵌套数据的情况下,更有弹性的方法是尝试使用RegEx找到JSON的开头,然后匹配开/闭括号,直到找到它的结尾。

像这样:

string ExtractJson(string source)
{
    var buffer = new StringBuilder();
    var depth = 0;
    // We trust that the source contains valid json, we just need to extract it.
    // To do it, we will be matching curly braces until we even out.
    for (var i = 0; i < source.Length; i++)
    {
        var ch = source[i];
        var chPrv = i > 0 ? source[i - 1] : default;
        buffer.Append(ch);
        // Match braces
        if (ch == '{' && chPrv != '''')
            depth++;
        else if (ch == '}' && chPrv != '''')
            depth--;
        // Break when evened out
        if (depth == 0)
            break;
    }
    return buffer.ToString();
}

// ...
var input = "...";
var json = ExtractJson(Regex.Match(input, @"data='{(.*)'}").Groups[1].Value);
var jsonParsed = JToken.Parse(json);

这可以处理输入中可能有多个json blob,或者其他一些内容也包含大括号的情况。