使用boost :: regex时,如何指定回车符和换行符?

时间:2013-07-25 09:26:49

标签: c++ regex boost 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角色的基本信息。我已经查看了boost文档页面但没有成功,所以我在尝试使用替代方法来解决问题之前作为最后的手段。

1 个答案:

答案 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:],需要对其进行转义。