【问题标题】:Match string between multiple brackets匹配多个括号之间的字符串
【发布时间】:2015-07-22 05:14:06
【问题描述】:

我有这个很长的 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

【问题讨论】:

  • 不幸的是,您无法使用正则表达式处理 Java 中的嵌套括号。使用 json 解析器。
  • 我通常使用JSON-Simple。一个很棒的教程,decoding
  • 另外,这不是有效的 Java 代码,如果是,jsondata 将是无效的 JSON。
  • json 不是正则表达式可解析的,你需要一个有状态的解析器。

标签: java regex json


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,但我不想要最后一个}。我想要第一个“flags:null”之后的}。
【解决方案2】:

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

看起来有点像:

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

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

【讨论】:

  • 在您的代码中我没有看到您使用jsondata 对象? responseData应该替换为jsondata吗?是临时变量吗?
  • 这是一个错字。对不起。
  • 我能问你为什么要使用 json 如果你以后只是要使用正则表达式吗? Json 解码可以很容易,但你必须正确创建你的 json....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
相关资源
最近更新 更多