2013-07-22 79 views
2

我正在實現某種解析器,我需要定位和反序列化嵌入到其他半結構化數據的json對象。我用正則表達式:正則表達式匹配嵌套的json對象

\\{\\s*title.*?\\} 

定位對象

{title:'Title'} 

但因爲表達式匹配只有第一發現閉花括號它不與嵌套對象。對於

{title:'Title',{data:'Data'}} 

它匹配

{title:'Title',{data:'Data'} 

這樣的字符串成爲反序列化無效。 我知道有一個貪婪的企業會考慮到,但我不熟悉正則表達式。你能幫我擴展表達式來消耗所有可用的大括號。

更新:

需要明確的是,這是一個試圖從具有嵌入的JSON像HTML + JS半結構化數據提取JSON數據。我使用GSon JAVA庫來實際解析提取的JSON。

+0

小心「OMG,不要使用正則表達式」! – SmokeyPHP

+0

..但一切都很嚴肅 - 爲什麼?什麼是數據,你需要做什麼 – SmokeyPHP

+3

@ViktorStolbin有預製的JSON解析庫。另外,由於JSON不是常規語言,因此無法用正則表達式正確解析(就像HTML一樣)。 –

回答

1

感謝@Sanjay T. Sharma指出我「支持配對」,因爲我最終對貪婪的表達有了一些理解,也感謝別人最初說我不應該做的事情。 好在事實證明這是確定使用表達

\\{\s*title.*\\} 

的貪婪變種因爲右括號之間沒有非JSON數據。

3

正如其他人所建議的,一個成熟的JSON解析器可能是一條可行的路。如果你想匹配,你有上述簡單的例子鍵值對,你可以使用:

(?<=\{)\s*[^{]*?(?=[\},]) 

對於輸入字符串

{title:'Title', {data:'Data', {foo: 'Bar'}}} 

這符合:

1. title:'Title' 
2. data:'Data' 
3. foo: 'Bar' 
+0

我應該試試!謝謝! –

0

這絕對是可怕的,我不敢相信我實際上把我的名字放在這個解決方案中,但是你能不能找到第一個{這個字符在Javascript塊中,並試圖通過適當的JSON解析庫解析剩餘的字符?如果它有效,你有一場比賽。如果沒有,請繼續閱讀,直到下一個{角色重新開始。

有一些問題存在,但他們或許可以被周圍的工作:

  • 你需要能夠識別的Javascript塊。大多數語言都具有HTML到DOM庫(我是用於Java的Cyberneko的粉絲),因此可以輕鬆專注於<script>...</script>塊。
  • 您的JSON解析庫需要在流發現錯誤時立即停止使用流中的字符,並且在它發生錯誤時它不需要關閉流。

的改進是,一旦你找到了第一{,尋找匹配}一個(一個簡單的計數器,每當你找到一個{是遞增和遞減,當你發現一個}應該做的伎倆)。嘗試將結果字符串解析爲JSON。迭代直到它工作,或者你已經跑出了可能的塊。

這是醜陋的,駭人聽聞的,不應該讓它生產代碼。不過,我覺得你只需要一個批處理作業就可以了,這就是我爲什麼要這麼做的原因。

+0

沒錯。這很醜陋,並且不易實施。 –