Регулярные выражения, соответствующие нескольким значениям одной группы - PullRequest
0 голосов
/ 23 мая 2019

Итак, у меня есть файл JSON с этим значением в виде массива:

"role":["ONE ROLE","ROLE TWO","ROLE WHATEVER",13123,123123]

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

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

\"(\w+)\"\:[\s\[]*\"([^\"|\,|\]]+)

Есть ли способ повторить эту группу захвата для всех значений?Если я просто использую вторую группу захвата ([^\"|\,|\]]+), я получу все поля.

Я попробовал этот подход: https://www.regular -expressions.info / captureall.html

Использование рекомендуемого \"(?<field>\w+)\"\:[\s\[]*\"!((?:[^\"|\,|\]]+)+)!, но безуспешно.

Есть какие-нибудь идеи здесь?

Большое спасибо!

1 Ответ

0 голосов
/ 23 мая 2019

Это не красиво, но будет делать то, что вы хотите.

В основном мы хотим «вручную» повторить шаблон (?:"?,"?)?([^\"|\,|\]]+)? больше раз, чем вы ожидаете найти элементы в массиве «role», чтобы поймать возможное ","next text.

Регулярное выражение:

\"(\w+)\"\:[\s+\[]*\"([^\"|\,|\]]+)(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?

Regex Demo

В javascript:

let regex = /\"(\w+)\"\:[\s+\[]*\"([^\"|\,|\]]+)(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?(?:"?,"?)?([^\"|\,|\]]+)?/

let json = '"role":["ONE ROLE","ROLE TWO","ROLE WHATEVER",13123,123123]';

let match = json.match(regex);

match = match.slice(2); //extract roles
match = match.filter(Boolean); //filter out undefined

console.log(match);
/*
[
  "ONE ROLE",
  "ROLE TWO",
  "ROLE WHATEVER",
  "13123",
  "123123"
] */
...