gpt4 book ai didi

c++ - 使用 boost::regex 时如何指定回车符和换行符匹配?

转载 作者:太空狗 更新时间:2023-10-29 21:23:37 24 4
gpt4 key购买 nike

在匹配字符串中的 \r\n 字符时,我遇到了 boost::regex 行为问题。我正在通过串行端口与我的 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 文档页面但没有成功,因此在使用替代方案 boost 解决问题之前,我在这里作为最后的手段尝试。

最佳答案

试试这个:

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

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

对您的两个替代正则表达式应用相同的更改也应该使它们起作用。

解释:

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

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

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

关于c++ - 使用 boost::regex 时如何指定回车符和换行符匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17854035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com