2013-07-02 4 views
-3

Я хочу использовать поиск в регулярном выражении для соответствия недопустимым JSON, содержащим пары имя/значение, где имя не указано в кавычках. Пример:Регулярное выражение для соответствия недопустимым строкам JSON

Invalid (я пытаюсь соответствовать этому):

{name:"value"} 

Действительно (я устрою им, чтобы выглядеть так):

{"name":"value"} 

Что RegEx можно использовать для наилучшего соответствия объектного ключа, который не содержат двойные кавычки? (Одиночные кавычки подходят для соответствия, так как я хочу, чтобы они конвертировали их в двойные кавычки).

+5

Почему бы не попробовать разобрать JSON и посмотреть, работает ли он? – jbabey

+0

Обновлен вопрос с большим контекстом. – anthony

+1

Не используйте регулярное выражение. Используйте анализатор JSON. Для этого они нужны. –

ответ

2

В общем случае в регулярном выражении, если вы хотите указать not, вы используете символ ^. Например, в примере, регулярное выражение строка соответствует ничего, кроме цитаты будет выглядеть следующим образом:

r'\{[ \t]+[^\"]*[a-zA-Z]+[^\"][ \t]+:' 

Конечно, это, вероятно, потерпеть неудачу в ряде случаев, как регулярное выражение не является правильным выбором для этой задачи , Вы должны просто попытаться разобрать его и выбросить ошибку, если она не работает. В Python:

import json 

try: 
    json.loads(attempt) 
except ValueError: 
    print "INVALID JSON" 
    raise 
+0

спасибо за попытку ... но это, похоже, не работает для меня. Я пытаюсь использовать это регулярное выражение в поиске файлов, чтобы отсеять файлы, которые мне нужно обновить. и, к сожалению, это также не способствует попытке использования функции json.loads(), поскольку мне сначала нужно определить, какие файлы содержат JSON. – anthony

+1

@anthony Файлы, которые заканчиваются на .json, это те, которые содержат json. Это также абсолютно удобно использовать json.loads(). Также кажется, что вы задаете здесь совершенно другой вопрос, чем в своем вопросе. Я предлагаю вам обновить свой вопрос и предоставить образцы, потому что определение правильности json легко, определяя, был ли какой-то неудачный ** попытка ** в json, а не в YAML, или какой-то другой подобный формат - совсем другая проблема. –

+0

Мы не используем файлы .json по причинам, которые я не буду объяснять. Чтобы быть откровенным, мой оригинальный вопрос буквально спросил, что я буквально хотел узнать: я хотел, чтобы RegEx соответствовал текстовым шаблонам, которые я указал. Я почтительно перешел от вашего первого ответа, потому что я попробовал его и обнаружил, что он не вернул никаких результатов, но, как следствие, вы несправедливо отказались от моего вопроса и моего предлагаемого решения. Я не просил вас делать предположения о цели моего вопроса. И, с уважением, я не думаю, что это был такой же ужасный вопрос, как вы его делаете. – anthony

-1

Ну, это работает для меня, как мне нужно, чтобы соответствовать строки, которые проходят бы для действительных имен переменных яваскрипта, с учетом одинарные кавычки с обеих сторон (и я тоже бросил в пособие для пространств с обеих сторон).

\{+(|')?+[a-zA-Z0-9_]*+(|')?+: 

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

  1. начать с {
  2. то, может или не может иметь пробел или апостроф
  3. тогда, иметь любое количество символов, совпадающая AZ, AZ, 0-9, или _
  4. то, может или не может иметь место или одиночные кавычки
  5. то есть:

Однако это также в конечном итоге соответствие всевозможных CSS, функции JQuery и другие строки не-JSON (по крайней мере, не истинные ответы JSON Я искал) ... для например, такие вещи, как {display:none} и $(...).animate({'height':'200px'}). Слишком много результатов, которые можно использовать для моих целей. Ах хорошо!

+0

'{display: none}' на самом деле недействителен JSON. Если точная вещь, которую вы просили, не соответствовала вашим требованиям, вы, вероятно, должны объяснить, что вы на самом деле пытаетесь сделать в своем вопросе, чтобы люди могли вам помочь. –

0

просто заменить \{\s*(?!(\"|\'))(\w*[a-zA-Z]\w*)(?!(\"|\'))\s*:(.+) с {"$2" :$4 и вы получите ни одна переменная не будет без "или" :)

1

JSON должен быть проанализирован, чтобы правильно выяснить, действительно. Вы можете использовать jison json parser example и изменения правила для учета вашего дополнительного действительного дела JSON.Однако, гораздо сложнее разобрать кусок JSON, если вы удалите требование к котировке из ключей.

Предлагаю оставить этот грамматик таким же и добавить некоторые error handling rules (альфа-поддержка, к сожалению). Это сложная проблема, поэтому найдите время, чтобы научиться до погружения, и вам будет намного лучше.

Смежные вопросы