Это не красиво, но будет делать то, что вы хотите.
В основном мы хотим «вручную» повторить шаблон (?:"?,"?)?([^\"|\,|\]]+)?
больше раз, чем вы ожидаете найти элементы в массиве «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"
] */