Использование регулярного выражения для извлечения данных из структурированных данных

Проблема, с которой я сталкиваюсь здесь, заключается в том, что у меня есть блок текста, который содержит структурированные данные (в виде полезной нагрузки JSON), и я заинтересован в извлечении значения одного из ключей для конкретного экземпляра JSON, представьте себе структурированные данные внутри следующим образом:

"Элемент 1": {"key1":"item1_key1_value", "key2":"item1_key2_value", "key3":"item1_key3_value"}, "Item 2": {"key1":"item2_key1_value", "key2":" item2_key2_value", "key3":"item2_key3_value"}

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

1(.)(?=item1_key2_value.) будет соответствовать фрагменту данных отсюда, но я не уверен, как лучше всего уменьшить его до нужного мне значения.


person factorof2    schedule 21.09.2015    source источник
comment
Вы не должны полагаться на регулярное выражение для разбора JSON. Используйте анализатор JSON. Это безопаснее и проще в обслуживании. Какой язык программирования вы используете для этой задачи?   -  person Wiktor Stribiżew    schedule 21.09.2015
comment
Я бы предпочел сделать это, но JSON содержится внутри большого текстового BLOB-объекта, который не является JSON. Мне все равно пришлось бы извлечь это и убедиться, что он не искажен, чтобы использовать библиотеку JSON. Я также не использую какой-либо конкретный язык, это в документе Google, извлекающем вещи с помощью XPATH, возвращаемая полезная нагрузка представляет собой текстовый BLOB-объект, который содержит интересующие меня JSON.   -  person factorof2    schedule 21.09.2015
comment
Итак, вы уверены, что вам нужно значение строки key2? Взгляните на "key2":"([^"]+). Я не уверен, что вы получите только первое совпадение. Документы Google используют JavaScript. Не могли бы вы показать соответствующий код, который у вас есть?   -  person Wiktor Stribiżew    schedule 21.09.2015
comment
Кстати, если это скрипт Google Docs, вы можете добавить соответствующий тег google-apps-script.   -  person Wiktor Stribiżew    schedule 22.09.2015


Ответы (1)


Синтаксис регулярных выражений для JSON четко указан на странице http://www.json.org. Если вы прокрутите немного вниз до того места, где написано «Строка представляет собой последовательность», вы найдете правильную структуру строки.

Предполагая, что строка соответствует правильной структуре JSON, вы можете использовать

"key2"\s*:\s*"((\\.|[^\\"])*)"

где \s означает пробел, а * означает 0 или более раз. \\ означает наклонную черту (обратную косую черту), за которой может следовать . (любой символ). Если он не встречает выплескивания, то вместо этого он ищет [^\\"], что означает не выплескивание и не кавычки.

Если вы хотите быть немного более строгим к точной форме JSON, вы можете попробовать

"key2"\s*:\s*"((\\["\\/bfnrtu]|[^\\"])*)"

который, как вы можете видеть, более точно следует форме строки на веб-странице.

person mareoraft    schedule 21.09.2015