我正在尝试在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;
}
为什么我会收到错误,如何修复此示例?
答案 0 :(得分:0)
http://en.cppreference.com/w/cpp/regex/ecmascript表示ECMAScript(std::regex
的默认类型)需要(?=
才能获得正向前瞻。
答案 1 :(得分:0)
这里有两个问题:
std::regex
风格不支持命名捕获组/反向引用,您需要使用编号捕获组/反向引用regex_search
使用regex_match
而不是requires a full string match。使用
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