Проверка предложения NMEA с использованием С++

Мне нужна помощь в создании регулярных выражений для предложения NMEA. Причина этого в том, что я хочу проверить данные, являются ли они правильной формой предложения NMEA. Использование С++. Ниже приведен пример предложения NMEA в форме GLL. Если возможно, я также хотел бы получить образец С++, который проверит код.

$GPGLL,5425,32,N,106,92,W,82808*64

$GPGLL,5425.33,N,106.91,W,82826*6a

$GPGLL,5425,32,N,106,9,W,82901*5e

$GPGLL,5425,32,N,106,89,W,82917*61

Я также включил выражение, которое я пробовал, которое я нашел в Интернете. Но когда я запускаю его, он говорит неизвестную escape-последовательность.

#include <iostream>
#include <regex>
#include<string.h>
using namespace std;

int main()
{
    // Target sequence
    string s = "$GPGLL, 54 30.49, N, 1 06.74, W, 16 39 58 *5E";

    // An object of regex for pattern to be searched
    regex r("[A-Z] \w+,\d,\d,(?:\d{1}|),[A-B],[^,]+,0\*([A-Za-z0-9]{2})");

    // flag type for determining the matching behavior
    // here it is for matches on 'string' objects
    smatch m;

    // regex_search() for searching the regex pattern
    // 'r' in the string 's'. 'm' is flag for determining
    // matching behavior.
    regex_search(s, m, r);

    // for each loop
    for (auto x : m)
        cout << "The nmea sentence is correct ";

    return 0;
}

person Duxton Lim    schedule 29.01.2020    source источник


Ответы (1)


Компилятор C++ интерпретирует \d и друзей как экранирующий код.

Либо удвойте обратную косую черту:

regex r("[A-Z] \\w+,\\d,\\d,(?:\\d{1}|),[A-B],[^,]+,0\\*([A-Za-z0-9]{2})");

или используйте необработанный литерал:

regex r(R"re([A-Z] \w+,\d,\d,(?:\d{1}|),[A-B],[^,]+,0\*([A-Za-z0-9]{2}))re");
person Botje    schedule 29.01.2020
comment
Спасибо вам за помощь :) - person Duxton Lim; 29.01.2020