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

How can you specify carriage return and newline character match when using boost::regex?

本文关键字:换行符 回车 regex boost 使用 何指定      更新时间:2023-10-16

在字符串中匹配rn字符时,boost::regex的行为有问题。我正在通过串行端口与我的linux C++应用程序中的调制解调器进行通信,我收到了来自它的以下消息

ATI3rnv3.244rnOKrn

我知道这个字符串是正确的,因为我实际上检查了返回的每个字符的ASCII十六进制值。问题是,我的应用程序需要去掉字符串的vX.XYZ部分指定的版本号。为此,我使用以下基于boost::regex的代码:

 string str_modem_fw_version_number = "";
 string str_regex("ATI3rnv(d+[.]d+)rnOKrn");
 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文档页面,但没有成功,所以在使用替代方案来解决问题之前,我在这里尝试了最后的手段。

试着用这个:

string str_regex("ATI3rnv(\d+[.]\d+)rnOKrn");

请注意,d被转义为\d

将相同的更改应用于两个可供选择的正则表达式也会使它们发挥作用。

解释

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

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

这是通过boost::regex识别[:digit:]的快捷方式。为了让boost::regex库"查看",需要对其进行转义。