我想知道,如果我可以解析&基於正則表達式篩選JSON文本數據;比方說,我有以下JSON解析使用正則表達式
{"key":"some:xx:yy", "value": 72311}
{"key":"some:xx:zz", "value": 72311}
{"key":"some:xx:qq", "value": 72311}
我想選擇有鍵字段相同的所有元組「一些:XX:」一部分,我怎麼能在一個「優雅」的方式歸檔此使用JSON?
我想知道,如果我可以解析&基於正則表達式篩選JSON文本數據;比方說,我有以下JSON解析使用正則表達式
{"key":"some:xx:yy", "value": 72311}
{"key":"some:xx:zz", "value": 72311}
{"key":"some:xx:qq", "value": 72311}
我想選擇有鍵字段相同的所有元組「一些:XX:」一部分,我怎麼能在一個「優雅」的方式歸檔此使用JSON?
您給出的示例包含三個不同的對象。所以你可以使用javascript來查找屬性中的文本。
obj1 = {"key":"some:xx:yy", "value": 72311};
if (obj1.key.indexOf("xx") !== -1) { // obj1.key contains "xx"
//do something
}
如果使用這些值的陣列,然後就可以簡單地通過數組循環,並尋找「XX」,就像上文針對陣列中的每個元素。找到後,可以將該元素分配給另一個數組。所以在循環結束時,「另一個數組」將包含所有包含「xx」的元素。
如果您不堅持使用RegEx,我可以向您展示循環的示例代碼。如果你堅持RegEx,讓我知道,我會幫你..只是開玩笑,讓我知道,我會刪除我的答案,並默默離開這個問題:)
正則表達式將是我使用Shell執行它的方式,但這也適用;我可以將自己的具體情況作爲indexOf(正如@Benjamin之前指出的那樣)似乎可以做到這一點。 – jtimz
我會給你一個直接的答案你問的問題,但希望複雜性和注意事項可以說服你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'
標誌匹配使用。
"key"
的屬性值不\uABCD
逃脫。"key"
和"value"
不是\uABCD
轉義。這些問題都可以通過使正則表達式變得更加複雜來解決,但是對於正則表達式,通常,處理角落情況的唯一方法是使正則表達式更大。
當代碼的漸進式改進爆炸大小時,代碼不可維護。
這是無效的JSON,你可能有_array_對象嗎? (這就是'[...這裏的對象]') –
爲什麼哦爲什麼你會在JavaScript中使用RegEx來解析JSON? – Madbreaks
@Madbreaks他不解析json - 他可能將JS對象和數組文字與JSON數據交換格式混合在一起,並且實際上想要基於正則表達式來過濾數組。就像'filtered = myList.filter(function(obj){return obj.key.indexOf(「some:xx」)=== 0;});' –