在字符串中匹配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文档页面但没有成功,所以我在尝试使用替代方法来解决问题之前作为最后的手段。
答案 0 :(得分:3)
请尝试使用此选项:
string str_regex("ATI3\r\nv(\\d+[.]\\d+)\r\nOK\r\n");
请注意,\
的{{1}}已转义为\d
。
对两个替代正则表达式应用相同的更改也应该使这些更改有效。
解释:
这不是新行或回车匹配的问题,而是escape sequences in string literals。 \\d
不是字符串文字的有效转义序列 - 实际上我的编译器警告我:
\d
这是boost :: regex识别的warning: unknown escape sequence: '\d' [enabled by default]
的快捷方式。为了让boost :: regex库“看到”[:digit:]
,需要对其进行转义。