LINUX.ORG.RU

Regexp для поиска значений внутри JSON

 , ,


0

2

Пытаюсь получить все значения лежащие в authorName из json со структурой вида:

"books": [{
	"year":1990,
	"authorName":"Ivanov",
	"country":"Russia",
	"qantity":12,
	"style":"Detective"
	},
	{
	"year":2000,
	"authorName":"Petrov",
	"country":"Russia",
	"qantity":12,
	"style":"Horror"
	},
	{
	"year":2000,
	"authorName":"Petrov",
	"country":"Russia",
	"qantity":12,
	"style":"Detective"
	}
]

Обязательные условия: 1) authorName лежит внутри books. 2) style= Detective.

Кол-во объектов в books может быть любым. Возможно ли достать значения из authorName посредством обычной регулярки? Пока мне это не удалось и на больших объемах у меня catastrophic backtracking, как я понял, нужно использовать атомарную группировку, пока что удалось достичь:

"authorName":"((?>[^"])*+)".+? - вот так выдираются все authorName, но не только из books и нет проверки на style.

"books":\[\{{1,1}.*?"authorName":"((?>[^"])*+)".+? - так ищется только первое вхождение

Подскажите пожалуйста, в какую сторону двигаться.

в какую сторону двигаться

Двигаться нужно в сторону JSON-парсера.

$ cat q.js 
{
"books": [{
	"year":1990,
	"authorName":"Ivanov",
	"country":"Russia",
	"qantity":12,
	"style":"Detective"
	},
	{
	"year":2000,
	"authorName":"Petrov",
	"country":"Russia",
	"qantity":12,
	"style":"Horror"
	},
	{
	"year":2000,
	"authorName":"Petrov",
	"country":"Russia",
	"qantity":12,
	"style":"Detective"
	}
]
}

$ jq '.books[].authorName' q.js
"Ivanov"
"Petrov"
"Petrov"
$ 
i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Два чаю это господину.
У ТСа фетиш на регулярки?

erfea ★★★★★ ()

можно попробовать взять json парсер и попробовать им.

Rastafarra ★★★ ()
Ответ на: комментарий от deep-purple

Можно и золотой ложкой какашки покушать :-) Говорят на автотазе любят болты кувалдой забивать... Можно долго аналогии приводить )

erfea ★★★★★ ()
Ответ на: комментарий от deep-purple

Нельзя. Это то же самое что и парсить ими HTML.

invy ★★★★★ ()
Ответ на: комментарий от invy

Можно.
Даже в твоём любимом треде на SO про это сказано

zolden ★★★★★ ()
Ответ на: комментарий от zolden

Json - context free. Regex может только регулярные языки.

Не знаю про какой тред на so ты говоришь. Мой любимый раздел cs - формальные языки и грамматики.

invy ★★★★★ ()
Ответ на: комментарий от AUX

регексофоб)

$ perl -lnE 'do{push@a,/authorName":"(.*)"/;pop@a if/style/&&!/Detective/}if/books":/../\]$/;END{say"@a"}'
chinarulezz ★★★★★ ()

JSON - LL1, какой бэктрекинг? И главное, какие в жопу регулярки?

Это не считая того, что есть jq, и мириада парсеров для любого языка программирования.

lovesan ()
Ответ на: комментарий от pru-mike

Такое возможно? Чтоб "хаотично" прилетал то перед то за?

chinarulezz ★★★★★ ()
Ответ на: комментарий от chinarulezz

В рамках одного документа наверно нет, но если добавится ключ или изменится источник, то мне кажется что порядок вполне может и поменяться.

pru-mike ★★ ()
Ответ на: комментарий от cdshines

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

genryRar ★★ ()
Ответ на: комментарий от genryRar

Нет, не скорее. RFC 7159:

An object is an unordered collection of zero or more name/value pairs[...]

cdshines ★★★★ ()
Ответ на: комментарий от cdshines

да, но нет. например в js порядок ключей сохраняется, за исключением ключей, являющихся числами. Сериализатор же (дефолтный браузерный) проходит по обьекту циклом и «наследует» этот порядок. получается, что стандарт не гарантирует сохранения порядка, но конкретная реализация конкретного языка с незапамятных времен реализует этот функционал. и если очень хочется, то можно этим пользоваться. другое дело, что такая фича может теоретически в любой момент стать «багом» и ее выпилят. но прошло 10 лет и она все еще на месте. ну и ее полезность тоже под вопросом, мне пока ниразу не пригодилось.

genryRar ★★ ()
Ответ на: комментарий от invy

Простой JSON, такой как в ОП - регулярный. Перечитай свой любимый раздел.

Конечно, это не повод совать сюда регулярки.

anonymous ()
Ответ на: комментарий от genryRar

Да надо оно, помнить это все. Никто просто не прикладывает регулярки к json, вот и все. Еще полагаться на реализацию вместо стандарта не хватало.

cdshines ★★★★ ()
Ответ на: комментарий от pru-mike

perlmonks
perl

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

anonymous ()
Ответ на: комментарий от pru-mike

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

cdshines ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.