Поиск объекта JQ с регулярным выражением - PullRequest
0 голосов
/ 26 апреля 2018

Я играл с JQ https://jqplay.org для извлечения данных JSON, и я видел операцию test, которая позволяет мне использовать регулярные выражения для извлечения данных.В следующем примере выполнения я передал шаблон регулярного выражения "^progressive$" в test для поиска данных:

DATA :

[
  {"genre": "progressive"},
  {"genre": "a progressive 1"}
]

QUERY :

map(select(.genre | test("^progressive$")))

РЕЗУЛЬТАТ :

[
  {
    "genre": "progressive"
  }
]

================================================================================

Теперь я хочу сделать противоположное выше.Значение genre в JSON - это мое регулярное выражение, а то, что я передаю test, - мои данные.Например:

ДАННЫЕ :

[
  {"genre": "^progressive$"},
  {"genre": "^abc$"}
]

QUERY :

Я еще не выяснил запрос :(но я попытался выполнить следующее, но оно не вернуло то, что я хочу или ошибка.

map(select("progressive" | test(.["genre"])))

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ :

[
  {
    "genre": "^progressive$"
  }
]

Я не знаю, еслиэто можно сделать или, если кто-нибудь знает, как это сделать. Я думаю о том, чтобы сделать длинный путь, который будет проходить через каждый объект в массиве и извлекать значение genre, а затем сравнивать с progressive. Это долгий путь, и этобудет работать, но мне любопытно, если кто-нибудь знает лучший и более эффективный способ.

Спасибо

1 Ответ

0 голосов
/ 26 апреля 2018

Похоже, вам нужно следующее:

map(. as $in | select("progressive" | test($in|.["genre"])))

($in|.["genre"] можно сократить до $in.genre, но я оставил канал, чтобы сделать вещи немного понятнее.)

Обратите внимание, как мы используем . as $in для настройки, чтобы мы могли вызывать test с соответствующим вводом и аргументом.

Variation

Чуть меньше ввода ...

map(.genre as $g | select("progressive" | test($g)))
...