使用boost::regex时,如何指定回车符和换行符匹配
How can you specify carriage return and newline character match when using boost::regex?
在字符串中匹配r
和n
字符时,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库"查看",需要对其进行转义。
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- QProcess::readAllStandardOutput() 和换行符
- 如果有换行符,clang 格式不会附加大括号
- 提取后返回换行符的C++istream.get()
- 如何在出现换行符之前将多个整数作为输入?
- 正则表达式 获取两个换行符之间的文本
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 在字符串中输入换行符
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- 使用 fgets() 从键盘读取时从以前的输入读取换行符
- 程序找不到回车符或换行符。退货超出范围
- 使用boost::regex时,如何指定回车符和换行符匹配
- C++ 字符串中的回车符和换行符