正则表达式匹配失败,无效的特殊左括号

时间:2017-11-15 20:46:53

标签: c++ regex string c++11 match

我正在尝试在c ++ 11中使用regexps,但我的代码总是抛出std::regex_error Invalid special open parenthesis.。尝试在字符串中查找第一个重复字符的最小示例代码:

std::string regexp_string("(?P<a>[a-z])(?P=a)"); // Nothing to be escaped here, right?
std::regex  regexp_to_match(regexp_string);
std::string target("abbab");
std::smatch matched_regexp;
std::regex_match(target, matched_regexp, regexp_to_match);
for(const auto& m: matched_regexp)
{
    std::cout << m << std::endl;
}

为什么我会收到错误,如何修复此示例?

3 个答案:

答案 0 :(得分:0)

http://en.cppreference.com/w/cpp/regex/ecmascript表示ECMAScript(std::regex的默认类型)需要(?=才能获得正向前瞻。

答案 1 :(得分:0)

这里有两个问题:

使用

std::string regexp_string(R"(([a-z])\1)");
std::regex regexp_to_match(regexp_string);
std::string target("abbab");
std::smatch matched_regexp;
if (std::regex_search(target, matched_regexp, regexp_to_match)) {
    std::cout << matched_regexp.str() << std::endl;
}
// => bb

请参阅C++ demo

R"(([a-z])\1)"原始字符串文字定义匹配任何小写ASCII字母的([a-z])\1正则表达式,然后再次匹配相同的字母。

答案 2 :(得分:0)

你的正则表达式崩溃的原因是因为std :: regex不支持命名组。但是,您仍然可以使用可用的内容来查找字符串中的第一个重复字符:

#include <iostream>
#include <regex>

int main()
{
    std::string s = "abc def cde";
    std::smatch m;
    std::regex r("(\\w).*?(?=\\1)");

    if (std::regex_search(s, m, r))
        std::cout << m[1] << std::endl;

    return 0;
}

打印

c