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 角色的基本信息。我浏览了 boost 文档页面,但没有成功,因此在使用替代方法来解决问题之前,我在这里尝试作为最后的手段。