为什么std :: regex_match不支持“零长度断言”?

时间:2017-02-04 06:20:13

标签: c++ regex c++11 standards

#include <regex>

int main()
{
    b = std::regex_match("building", std::regex("^\w*uild(?=ing$)"));
    //
    // b is expected to be true, but the actual value is false.
    //
}

我的编译器是clang 3.8。

为什么std :: regex_match不支持“零长度断言”?

1 个答案:

答案 0 :(得分:2)

regex_match仅用于匹配 整个 输入字符串。您的正则表达式 - 正确编写为"^\\w*uild(?=ing$)并使用反斜杠转义,或者raw string R"(^\w*uild(?=ing$))" - 仅实际匹配(使用)前缀build。它向前看ing$,并且会成功找到它,但由于整个输入字符串没有消耗,regex_match拒绝匹配。

如果你想使用regex_match但只捕获第一部分,你可以使用^(\w*uild)ing$(或只是(\w*uild)ing,因为必须匹配整个字符串)并访问第一个捕获组。

但是,既然您仍在使用^$,那么您也可以使用regex_search代替:

int main()
{
    std::cmatch m;
    if (std::regex_search("building", m, std::regex(R"(^\w*uild(?=ing$))"))) {
        std::cout << "m[0] = " << m[0] << std::endl;  // prints "m[0] = build"
    }
    return 0;
}