2012-11-26 67 views
0

如何匹配具有換行符的字符串中的模式? 例如JAVA最長模式匹配字符串與換行符

requisition({"title":"my json", 
      "items" : [{ "A": "a", 
          "B": "b"} 
         ] 
      }) 

我要趕這隻

{"title":"my json", 
      "items" : [{ "A": "a", 
          "B": "b"} 
         ] 
} 

我想是這樣

String pattern = ".*(\\{.*\\}).*"; 
Pattern r = Pattern.compile(pattern, Pattern.DOTALL); 

但是,沒有sucess。任何消化?

只是爲了更清楚。這是我的input

+0

「沒有成功」。它失敗了嗎?你有錯誤的比賽嗎?哪一個?我是否正確地假設你從「A」開始捕獲所有的東西......? –

+0

@Reimeus,這是一個JSON解析器實現我想要做的 – Medeiros

+0

你總是有一個輸入是這種格式?我的意思是,它總是以某個JSON對象作爲參數的函數調用?在這種情況下,你不能使用子字符串? –

回答

1

與單個JSON對象的問題作爲輸入很簡單:你的第一個.*是貪婪。所以它會消耗一切,直到最後的{,後面還有}。如果你所做的.* ungreedy(或離開它了),你應該得到充分的JSON對象:

String pattern = ".*?(\\{.*\\}).*"; 

但你可以(也應該)完全離開了開頭和結尾重複:

String pattern = "\\{.*\\}"; 

然後你甚至不需要捕捉任何東西。請注意,這必須與find而不是matches一起使用。

但是,您的輸入具有多個JSON對象。這是你遇到正則表達式問題的地方。一些引擎支持允許正確嵌套括號的構造(以檢查哪些實際上屬於一起)。但是這些正則表達式很容易變得醜陋而不可維護。

你現在過得更好,手動走字符串,並保持當前嵌套級別的計數。每當你回到頂層時,你只需切斷一個子串(從相應的左括號到當前位置)。

+0

謝謝。我習慣於用Python進行編程,我喜歡用RE來解決問題,但在這個特定的問題中,我認爲最好的解決方案就像'String sub = s.substring(s.indexOf(「{」),s.lastIndexOf 「}」)+ 1);' – Medeiros

+0

@Medeiros是的,對於單個JSON對象,這可能是最好的(也是最易讀的)解決方案。但是,它仍然不能解決包含JSON對象列表的文件的問題。 –