匹配多个括号之间的字符串

时间:2015-05-11 15:47:05

标签: java regex json

我有这么长的JSON字符串。我想过滤它,只获得第一个括号之间的数据。问题是,我有许多其他括号,因此我的正则表达式模式不能正常工作。

这是JSON字符串:

    String jsondata = "["
    +"{"
      +  "test: 63453645"
        +"date: 2016-07-17"
       "{"
        + "id:534534"
        +"}"
      + "blank : null"
      + "flags : null"
     + "}"
    +"{"
      +  "test: 543564236"
        +"date: 2014-07-17"
        +"{"
        + "id:6532465"
        +"}"
      + "blank : null"
      + "flags : null"
    + "}"
    +"]";

    pattern = "\\{[^{}]*\\}";
    pr = Pattern.compile(pattern);  
    math = pr.matcher(jsondata);
    if (math.find()) {
        System.out.println(math.group());
    }
    else
        System.out.println("nomatch");

我所拥有的模式的问题是它只打印到}之后的第一个id:,但我希望它在之后的}结束flags:null。

我只想打印第一个匹配,即之后的字符串,因为它也以相同的字符开头和结尾,这就是为什么我有if语句而不是while循环。

有什么建议吗?谢谢!

带有多个括号的正则表达式似乎是一项非常困难的任务。我可以匹配最后一个字符串吗?从{开始到flags : null

2 个答案:

答案 0 :(得分:2)

就像我在评论中所说的那样, 我通常使用JSON-Simple。 一个很棒的教程,decoding

看起来有点像:

JSONObject obj = JSONValue.parse(jsondata);
obj.get("test");

PS。 我确实在你的json数据中看到了一些错误,利用jsonlint验证你的json是否格式正确......

答案 1 :(得分:0)

这将获取第一个{和最后一个}之间的所有内容:

String guts = jsondata.replaceAll("(?s)^.*?\\{(.*?flags : null[^}]*).*$", "$1");

正则表达式会在第一个{到您的信号量文本和所有非}个字符之后捕获所有内容。