std::regex 和 boost::regex 的区别

问题描述 投票:0回答:1

当匹配字符串中存在

\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库表现正常,但我不明白为什么标准库是这样实现的。

c++ regex
1个回答
1
投票

这是预料之中的。

std::regex
默认风格是 ECMAScript-262,在 ECMAScript 中,
.
字符匹配除任何
LineTerminator
字符之外的任何字符:

生产 Atom :: . 评估如下:

  1. 设 A 为除 LineTerminator 之外的所有字符的集合。
  2. 调用 CharacterSetMatcher(A, false) 并返回其 Matcher 结果。

然后7.3行终止符说:

行终止符包含在与正则表达式中的

\s
类匹配的空白字符集中。

代码单位值 姓名 正式名称
\u000A
换行
<LF>
\u000D
回车
<CR>
\u2028
行分隔符
<LS>
\u2029
段落分隔符
<PS>

Boost regex 中,

.
匹配

flag match_not_dot_null 传递给匹配算法时的 NULL 字符。
flag match_not_dot_newline 传递给匹配算法时的换行符。

因此,Boost 正则表达式中的

.
\r
匹配,而在
std::regex
中则不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.