3

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

4

1 回答 1

3

试试这个:

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

请注意,\of\d被转义为\\d

将相同的更改应用于您的两个替代正则表达式也应该使这些工作。

说明

这不是换行符或回车匹配的问题,而是字符串文字中的转义序列\d不是字符串文字的有效转义序列 - 实际上我的编译器警告我:

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

它是[:digit:]boost::regex 识别的快捷方式。为了让 boost::regex 库“看到” \,它需要被转义。

于 2013-07-25T09:40:05.453 回答