2011-05-10 65 views
2

我有一個大的JSON文件,格式化在多行。我想找到對象有一個給定的屬性。對象保證不包含任何進一步的嵌套對象。假設給定的屬性是"bad",那麼我想在下面的第二個元素中找到"foo"的值(但不是在第一個元素中)。Vim正則表達式來尋找缺失的JSON元素

{ 
    result: [ 
    { 
     "foo" : { 
     "good" : 1, 
     "bad" : 0 
     }, 
     "bar" : 123 
    }, 
    { 
     "foo" : { 
     "good" : 1 
     }, 
     "bar" : 123 
    } 
    ] 
} 

我知道multi-line regexes in Vim但我想要做什麼,我不能得到任何東西。任何指針?

+4

你必須爲此使用Vim嗎?實際的JSON庫將是一個更好的工具。 – jwodder 2011-05-10 18:18:04

+0

我同意jwodder。如果我是你,我只需將JSON數據放入瀏覽器的JS控制檯的變量中,然後瀏覽它的內容,在元素丟失的地方記錄索引。 – namuol 2011-05-10 18:39:21

+0

@jwodder,@namuoi,我明白這可能是明智的選擇。 – YXD 2011-05-10 23:15:11

回答

4

嘗試以下操作:

/\v"foo"\_s*:\_s*\{%(%(\_[\t ,]"bad"\_s*:)@!\_.){-}\} 

當你需要排除的東西,你應該看看負查找aheads或查找屁股(後者是比較慢,不像VIM的Perl/PCRE正則表達式不支持看 - 除了固定寬度(或許多可選的固定寬度)之外的後面)。

+0

太棒了,這實在是太瘋狂了!偉大的技能。 – YXD 2011-05-10 22:58:46

1

JSON是context free grammar,因此並不經常。除非你可以制定更嚴格的規則,否則正則表達式將無法做到你想要的。

+0

當然,我不想解析任意的JSON,它的格式正如我上面給出的。 「foo」的字段不包含任何嵌套對象或大括號,只是鍵:數字,鍵:數字。我只想要一個貪婪的多行匹配:'開頭字符','不包含給定字詞的任何東西','結束字符'... – YXD 2011-05-10 19:20:54