У меня проблема с 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. Я безуспешно просматривал страницы документации надстройки и поэтому в качестве последнего средства пытаюсь использовать альтернативу надстройки для решения проблемы.
Попробуйте с этим вместо этого:
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 «увидела» \
, это должно быть экранировано.
Других решений пока нет …