2014-03-04 920 views
1

我想知道,如果我可以解析&基於正則表達式篩選JSON文本數據;比方說,我有以下JSON解析使用正則表達式

{"key":"some:xx:yy", "value": 72311} 
{"key":"some:xx:zz", "value": 72311} 
{"key":"some:xx:qq", "value": 72311} 

我想選擇有鍵字段相同的所有元組「一些:XX:」一部分,我怎麼能在一個「優雅」的方式歸檔此使用JSON?

+0

這是無效的JSON,你可能有_array_對象嗎? (這就是'[...這裏的對象]') –

+2

爲什麼哦爲什麼你會在JavaScript中使用RegEx來解析JSON? – Madbreaks

+2

@Madbreaks他不解析json - 他可能將JS對象和數組文字與JSON數據交換格式混合在一起,並且實際上想要基於正則表達式來過濾數組。就像'filtered = myList.filter(function(obj){return obj.key.indexOf(「some:xx」)=== 0;});' –

回答

0

您給出的示例包含三個不同的對象。所以你可以使用javascript來查找屬性中的文本。

obj1 = {"key":"some:xx:yy", "value": 72311}; 

if (obj1.key.indexOf("xx") !== -1) { // obj1.key contains "xx" 
    //do something 
} 

如果使用這些值的陣列,然後就可以簡單地通過數組循環,並尋找「XX」,就像上文針對陣列中的每個元素。找到後,可以將該元素分配給另一個數組。所以在循環結束時,「另一個數組」將包含所有包含「xx」的元素。

如果您不堅持使用RegEx,我可以向您展示循環的示例代碼。如果你堅持RegEx,讓我知道,我會幫你..只是開玩笑,讓我知道,我會刪除我的答案,並默默離開這個問題:)

+0

正則表達式將是我使用Shell執行它的方式,但這也適用;我可以將自己的具體情況作爲indexOf(正如@Benjamin之前指出的那樣)似乎可以做到這一點。 – jtimz

0

我會給你一個直接的答案你問的問題,但希望複雜性和注意事項可以說服你JSON.parse是一個更好的選擇。


你可以寫一個正則表達式匹配一個這樣的元組,但你不能寫一個正則表達式匹配所有這樣的元組。

要解釋爲什麼,認爲相匹配的正則表達式之一:

var stringBody = '(?:[^"\\\\]|\\\\.)*'; 
var string = '"' + stringBody + '"'; 
var space = '[ \t\r\n\f]*'; 
var colon = space + ':' + space; 
var comma = space + ',' + space; 

var uglyRegex = '^(?:[^"]|' + string + ')*?' 
    + '"key"' + colon + '"(some:xx:' + stringBody + ')"' + comma 
    + '"value"' + colon + '((?:[^\},"]|' + string + ')*)'; 

這是通過尋找非字符串或完整串令牌之前,其價值與some:xx:,然後開始一個鍵的數量降到最低尋找價值。

它留下匹配組1中的密鑰和匹配組2

由於必須匹配從頭開始正確地識別字符串標記邊界值時,它不能在一個'g'標誌匹配使用。

注意事項

  1. 它假定某些字符在"key"的屬性值不\uABCD逃脫。
  2. 它假設屬性名稱中的字符"key""value"不是\uABCD轉義。
  3. 它需要鍵和值按順序發生。
  4. 它無法分辨同一物體中會出現其他屬性。

這些問題都可以通過使正則表達式變得更加複雜來解決,但是對於正則表達式,通常,處理角落情況的唯一方法是使正則表達式更大。

當代碼的漸進式改進爆炸大小時,代碼不可維護。

+0

我傾向於indexOf來查找所有這些元組......因爲這看起來相當難看;你完全可以這樣命名! – jtimz

+0

固定子字符串匹配帶有一個更大的警告集,所以基於它的任何解決方案的確會非常脆弱。 –

+0

那麼@Mike,完成所需設施的方式是什麼?所有的情況都被考慮到了。 – jtimz