当匹配字符串中存在
\r
时,std::regex
和boost::regex
表现不同。为什么?
代码:
#include <iostream>
#include <string>
#include <regex>
#include <boost/regex.hpp>
int main()
{
std::string content = "123456728\r,234";
std::string regex_string = "2.*?4";
boost::regex reg(regex_string);
boost::sregex_iterator it(content.begin(),content.end(),reg);
boost::sregex_iterator end;
std::cout <<"content size:" << content.size() << std::endl;
//boost match 234 and 28\r,234
while (it != end)
{
std::cout <<"boost match: " << it->str(0) <<" size: " <<it->str(0).size() << std::endl;
++it;
}
std::regex regex_std(regex_string);
std::sregex_iterator it_std(content.begin(),content.end(),regex_std);
std::sregex_iterator std_end;
//std match 234 and 234
while (it_std != std_end)
{
std::cout <<"std match: " << it_std->str(0) <<" size: " << it_std->str(0).size() << std::endl;
++it_std;
}
return 0;
}
我认为boost库表现正常,但我不明白为什么标准库是这样实现的。
这是预料之中的。
std::regex
默认风格是 ECMAScript-262,在 ECMAScript 中,.
字符匹配除任何 LineTerminator
字符之外的任何字符:
生产 Atom :: . 评估如下:
- 设 A 为除 LineTerminator 之外的所有字符的集合。
- 调用 CharacterSetMatcher(A, false) 并返回其 Matcher 结果。
然后7.3行终止符说:
行终止符包含在与正则表达式中的
类匹配的空白字符集中。\s
代码单位值 | 姓名 | 正式名称 |
---|---|---|
|
换行 |
|
|
回车 |
|
|
行分隔符 |
|
|
段落分隔符 |
|
在 Boost regex 中,
.
匹配
将 flag match_not_dot_null 传递给匹配算法时的 NULL 字符。
当 flag match_not_dot_newline 传递给匹配算法时的换行符。
因此,Boost 正则表达式中的
.
与 \r
匹配,而在 std::regex
中则不匹配。