Можно принять во внимание начало строки и запятую с необязательным пробелом и удалить внешнюю группу, чтобы использовать только 1 группу захвата. Чтобы цифры не были частью большого слова, вы можете добавить границу слова \b
Обратите внимание, что вы можете опустить квантификатор +
после )+
, потому что это повторит группу и даст вам только значение последней итерации.
(?:^|[,-] ?)(?<JOUR>J[0-9]+)\b
(?:^|[,-] ?)
Сопоставьте начало строки, запятую или дефис с дополнительным пробелом
(?<JOUR>J[0-9]+)
Именованная группа захвата JOUR
, совпадение J
и затем 1+ цифр
\b
Граница слова, чтобы цифры не были частью большего слова
Regex demo
Используйте exec , чтобы получить значение из первой группы захвата
const regex = /(?:^|, ?)(?<JOUR>J[0-9]+\b)+/g;
let m;
[
"J1, J2, J3 - J5, J7",
"J1,J2, J3"
].forEach(str => {
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.log(m[1]);
}
});