繁体   English   中英

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

[英]Extract json data from string using regex

我有如下数据字符串:

....
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("}]") 但它不能正常工作和正确的方法。

我不完全确定没有更好的方法可以做到这一点,但是以下正则表达式字符串应该可以为您提供所需的数据:

// 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 或其他一些也包含大括号的内容的情况。

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

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

正则表达式 101 示例

我们可以使用平衡组,而不是使用许多其他语言利用的递归。 我们基本上所做的是将开括号的数量与 json 对象中的右括号的数量相比较,如果有任何剩余的开括号没有匹配的右括号,那么我们拒绝捕获(通过否定环视)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM