2015-05-11 71 views
2

我有這個很長的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

+3

不幸的是你不能用正則表達式處理java中的嵌套括號。使用json解析器。 –

+0

我通常使用[JSON-Simple](https://code.google.com/p/json-simple/)。 一個很棒的教程,[解碼](https://code.google.com/p/json-simple/wiki/DecodingExamples)。 –

+0

此外,這是無效的Java代碼,如果是,jsondata將是無效的JSON。 –

回答

0

這將抓住一切的第一{和最後}之間:

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

正則表達式第一{到你的信號量文本和所有非}字符以下後捕獲的一切。

+0

謝謝,但我不想最後}。我想要在第一個「flags:null」之後的}。 –

+0

請參閱我的更新。 –

+0

@sand試試最新編輯 – Bohemian

2

像我在評論中說的, 我通常利用JSON-Simple。 一個很好的教程,decoding

看起來有點像:

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

PS。 我確實在你的json數據中發現了一些錯誤,利用jsonlint來驗證你的json格式是否正確...

+0

請看我的更新。 –

+0

在你的代碼中我看不到你使用'jsondata'對象?應該'responseData'替換爲'jsondata'?它是一個臨時變量? –

+0

這是一個錯字。抱歉。 –

相關問題