Регулярное выражение для METAR - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь создать парсер для METAR (кодированная погода для авиации). Работа с регулярным выражением для достижения этого.

EGJJ 240820Z 29009KT 1300 R26/P2000 FG TSRA VCFG BR FEW000 SCT001 BKN002 11/10 Q1016

(вымышленный нереалистичный c метар только для тестирования)

Это типичный METAR, который мне нужно проанализировать. Часть, на которой я застрял, - это анализ погодных явлений. В этом случае мне нужно поймать FG TSRA VCFG BR.

(?<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)

Это мой текущий REGEX, я ловлю FG, VCFG, BR. Но НЕ ЦРА. Я не могу понять, почему эта часть не захвачена. У кого-нибудь есть советы?

1 Ответ

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

Поскольку вы используете именованные группы захвата, я предполагаю, что вы также используете браузер, который поддерживает позитивные взгляды. Вы можете заставить свое регулярное выражение работать, делая все группы необязательными и используя обзорную область для пробела и прогнозную строку для +, - или букву в начале и прогнозную точку для пробела в конце:

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}.`);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...