Vim регулярное выражение, чтобы найти отсутствующий элемент JSON - PullRequest
2 голосов
/ 10 мая 2011

У меня большой файл JSON, отформатированный в несколько строк. Я хочу найти объекты, которые не имеют данное свойство. Гарантируется, что объекты не содержат никаких дополнительных вложенных объектов. Скажем, данное свойство было "bad", тогда я бы хотел найти значение "foo" во втором элементе следующего (но не в первом элементе).

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

Я знаю о многострочных регулярных выражениях в Vim , но я не могу получить ничего, что делает то, что я хочу. Есть указатели?

Ответы [ 2 ]

4 голосов
/ 11 мая 2011

Попробуйте следующее:

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

Когда вам нужно что-то исключить, вы должны смотреть на отрицательные упущения или упущения (последнее медленнее и, в отличие от регулярных выражений Perl / PCRE vim, не поддерживает упущения, кроме фиксированной ширины (или ряда альтернативных фиксированной ширины).).

1 голос
/ 10 мая 2011

JSON является контекстно-свободной грамматикой и поэтому не является регулярной. Если вы не можете дать более строгий набор правил, никакое регулярное выражение не сможет делать то, что вы хотите.

...