Регулярное выражение Vim для поиска недостающего элемента JSON

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

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

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


person YXD    schedule 10.05.2011    source источник
comment
Вам нужно использовать для этого Vim? Фактическая библиотека JSON была бы гораздо лучшим инструментом.   -  person jwodder    schedule 10.05.2011
comment
Я согласен с jwodder. На вашем месте я бы просто поместил данные JSON в переменную JS-консоли моего браузера и прошелся по ее содержимому, регистрируя индекс везде, где отсутствует элемент.   -  person namuol    schedule 10.05.2011
comment
@jwodder, @namuoi, я понимаю, что это, вероятно, разумный вариант.   -  person YXD    schedule 11.05.2011


Ответы (2)


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

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

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

person ZyX    schedule 10.05.2011

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

person Andrew White    schedule 10.05.2011
comment
Конечно, я не собираюсь разбирать произвольный JSON, это именно тот формат, который я указал выше. Поля foo не содержат вложенных объектов или фигурных скобок любого типа, только ключ: число, ключ: число. Мне просто нужно жадное многострочное совпадение: opening character, anything that doesn't include a given word, _4 _... - person YXD; 10.05.2011