Vim正则表达式找到缺少的JSON元素

时间:2011-05-10 18:13:52

标签: regex json vim vi

我有一个很大的JSON文件,格式化为多行。我想找到具有给定属性的对象。保证对象不包含任何进一步的嵌套对象。假设给定属性为"bad",那么我想在下面的第二个元素中找到"foo"的值(但不是在第一个元素中)。

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

我知道multi-line regexes in Vim,但我无法得到任何符合我想要的东西。有什么指针吗?

2 个答案:

答案 0 :(得分:4)

尝试以下方法:

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

当你需要排除某些东西时,你应该看看负面前瞻或后视(后者是慢的,不像vim Perl / PCRE正则表达式不支持后视除了固定宽度(或许多替代)固定宽度)。)

答案 1 :(得分:1)

JSON是context free grammar,因此不是常规的。除非你能给出一套更严格的规则,否则正则表达式都无法做你想做的事。