【问题标题】:Regexp matching fails with invalid special open parenthesis正则表达式匹配失败,特殊开括号无效
【发布时间】:2018-04-29 05:46:52
【问题描述】:

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

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;
}

为什么会出现错误以及如何修复此示例?

【问题讨论】:

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


    【解决方案1】:

    正则表达式崩溃的原因是 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
    

    【讨论】:

      【解决方案2】:

      这里有两个问题:

      使用

      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 正则表达式。

      【讨论】:

        【解决方案3】:

        http://en.cppreference.com/w/cpp/regex/ecmascript 表示 ECMAScript(std::regex 的默认类型)需要 (?= 才能进行正向预测。

        【讨论】:

        • 你能告诉我如何纠正这个例子吗?我的目标是标记捕获组
        • 捕获什么的组?你需要"(a[a-z])(a)" 什么的吗?
        • 我需要找到重复出现的模式,所以我希望组只捕获给定捕获组标签的相同字符。
        • 你的意思是"(a[a-z])\1"在“abab”中捕获“ab”吗?您可以使用反向引用来查找相同的匹配项:“\”。
        • 所以可能只是([a-z])\1:一个捕获单个小写字符并立即反向引用它的组。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多