2011-05-10 64 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