Поскольку вы используете именованные группы захвата, я предполагаю, что вы также используете браузер, который поддерживает позитивные взгляды. Вы можете заставить свое регулярное выражение работать, делая все группы необязательными и используя обзорную область для пробела и прогнозную строку для +
, -
или букву в начале и прогнозную точку для пробела в конце:
let s = 'EGJJ 240820Z 29009KT 1300 R26/P2000 FG TSRA VCFG BR FEW000 SCT001 BKN002 11/10 Q1016';
let r = /(?<=\s)(?=[A-Z+-])(?<intensity>VC|\+|\-)?(?<descriptor>MI|BC|PR|DR|BL|SH|TS|FZ)?(?<precipitation>DZ|RA|SN|SG|IC|PL|GR|GS|UP)?(?<obscuration>BR|FG|FU|VA|DU|SA|HZ)?(?=\s)/g;
let m = s.matchAll(r)
for (const match of m) {
console.log(`Found ${match[0]} start=${match.index} end=${match.index + match[0].length}.`);
}
Если вы используете браузер, который не поддерживает эти расширения, вы можете использовать это регулярное выражение, которое соответствует пробелу в начале (который пропускается с помощью группа захвата) и ставит пробел в конце:
let s = 'EGJJ 240820Z 29009KT 1300 R26/P2000 FG TSRA VCFG BR FEW000 SCT001 BKN002 11/10 Q1016';
let r = /\s((?=[A-Z+-])(VC|\+|\-)?(MI|BC|PR|DR|BL|SH|TS|FZ)?(DZ|RA|SN|SG|IC|PL|GR|GS|UP)?(BR|FG|FU|VA|DU|SA|HZ)?)(?=\s)/g;
let m = s.matchAll(r)
for (const match of m) {
console.log(`Found ${match[1]} start=${match.index+1} end=${match.index + match[1].length}.`);
}