【问题标题】:This regex doesn't work in c++此正则表达式在 C++ 中不起作用
【发布时间】:2015-06-28 18:57:06
【问题描述】:

它应该匹配 "abababab",因为 "ab" 连续重复两次以上,但代码不打印任何输出。 在 C++ 中使用正则表达式还有其他技巧吗?

我尝试使用其他语言,效果很好。

#include<bits/stdc++.h>

int main(){

  std::string s ("xaxababababaxax");
  std::smatch m;
  std::regex e ("(.+)\1\1+");   

   while (std::regex_search (s,m,e)) {
    for (auto x:m) std::cout << x << " ";
    std::cout << std::endl;
    s = m.suffix().str();
  }

  return 0;
}

【问题讨论】:

  • 请注意,它也匹配xa
  • (.+)不就是贪心匹配整个字符串吗?因此 \1 没有任何意义
  • 不要使用&lt;bits/...&gt;,它不可移植,而且你不能保证它明天能正常工作。此外,您可能需要将 gcc 升级到最新最好的 5.x 版本,较早的版本没有有效的正则表达式实现。
  • 使用原始字符串 R"((.+)\1\1+)" 或转义反斜杠 "(.+)\\1\\1+"
  • @Ed,回溯将使.+ 连续减少匹配,直到\1 匹配为止。这是正则表达式中相当常见的习语。

标签: c++ regex


【解决方案1】:

您的问题是您的反斜杠正在转义字符串中的“1”。您需要通知 std::regex 将它们视为 '' 。您可以通过使用原始字符串 R"((.+)+)" 或通过转义斜杠来执行此操作,如下所示:

#include <regex>
#include <string>
#include <iostream>


int main(){

  std::string s ("xaxababababaxax");
  std::smatch m;
  std::regex e ("(.+)\1\1+");

   while (std::regex_search (s,m,e)) {
    for (auto x:m) std::cout << x << " ";
    std::cout << std::endl;
    s = m.suffix().str();
  }

  return 0;
}

产生输出

abababab ab 

【讨论】:

  • 如何添加标志以返回匹配的最小字符串,例如 aaaaaa 应该匹配 a 重复 6 次而不是 aa 重复 3 次?
  • 唔。我不得不承认你正在用我以前从未尝试过的正则表达式做一些事情。您可以尝试使用“非贪婪运算符”stackoverflow.com/questions/11898998/regex-match-non-greedy,即“?”,看看是否能得到您想要的结果。让我知道你发现了什么!
  • 没问题。正则表达式可能会让人头疼,但它们确实是一项值得开发的技能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2021-03-18
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多