Как вы можете указать возврат каретки и совпадение символов новой строки при использовании boost :: regex?

У меня проблема с boost::regex поведение, когда дело доходит до сопоставления \r а также \n символы в строке. Я связываюсь через последовательный порт с модемом из моего приложения Linux C ++ и получаю от него следующее сообщение

ATI3\r\nv3.244\r\nOK\r\n

Я знаю, что эта строка верна, поскольку я проверяю шестнадцатеричные значения ASCII каждого возвращаемого символа. Проблема в том, что мое приложение должно удалить номер версии, указанный vX.XYZ часть строки. Для этого я использую следующее boost::regex основанный код:

 string str_modem_fw_version_number = "";
string str_regex("ATI3\r\nv(\d+[.]\d+)\r\nOK\r\n");
boost::regex patt;
try
{
patt.assign(str_regex);
boost::cmatch what;
if (boost::regex_match(str_reply.c_str(), sc_what, patt)) {
str_modem_fw_version_number = string(sc_what[1].first,sc_what[1].second);
}
}
catch (const boost::regex_error& e)
{
cout << e.what() << endl;
}

Вышеприведенное не работает — я вижу, что полученная строка верна, но я уверен, что я делаю очевидную ошибку с символами CR и NL в регулярном выражении.
Я также попробовал следующее, которые не работают

 string str_regex("ATI3.*(\d+[.]\d+).*");
string str_regex("ATI3\\r\\nv(\d+[.]\d+)\\r\\nOK\\r\\n");

и вариации на тему, но я думаю, что мне не хватает некоторой базовой информации о том, как boost::regex относится к символам NL и CR. Я безуспешно просматривал страницы документации надстройки и поэтому в качестве последнего средства пытаюсь использовать альтернативу надстройки для решения проблемы.

3

Решение

Попробуйте с этим вместо этого:

string str_regex("ATI3\r\nv(\\d+[.]\\d+)\r\nOK\r\n");

Обратите внимание, что \ из \d сбежал, чтобы стать \\d,

Применение того же изменения к вашим двум альтернативным регулярным выражениям также должно сработать.

объяснение :

Это не проблема с соответствием новой строки или возврата каретки, а скорее с escape-последовательности в строковых литералах. \d не является допустимой escape-последовательностью для строкового литерала — фактически мой компилятор предупреждает меня об этом:

warning: unknown escape sequence: '\d' [enabled by default]

Это ярлык для [:digit:] распознается Boost :: Regex. Чтобы библиотека boost :: regex «увидела» \, это должно быть экранировано.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector