std::正则表达式等同于'/g'全局修饰符

std::regex equivalent of '/g' global modifier

本文关键字:全局 正则表达式 std 等同于      更新时间:2023-10-16

在Perl中,我可以做到这一点:

$text = '1747239';
@matches = ($text =~ m/(d)/g);
# @matches now contains ('1', '7', '4', '7', '2', '3', '9')

使用C++正则表达式匹配,复制这种行为的最佳方式是什么我得到一套包括所有比赛的比赛?

我现在有这个:-

compiledRegex = std::regex(regex, std::tr1::regex_constants::extended);
regex_search(text, results, compiledRegex);
int count = results.size();
// Alloc pointer array based on count * sizeof(mystruct).
for ( std::cmatch::iterator match = results.begin(); 
      match != results.end(); 
      ++match )
{
    // Do something with match;
}

然而,这只会给我第一个匹配,就像没有/g的Perl一样,这很好,但我喜欢/g效果。

那么,有没有一个好的方法可以做到这一点,或者我必须一遍又一遍地运行regex?

您应该多次调用regex_search。其返回值指定是否有更多匹配项。每次你叫它,你就会得到一个新的匹配。结果返回的迭代器遍历正则表达式中定义的组子匹配。第一个条目总是完全匹配,这就是为什么在您的案例中count == 1

std::string::const_iterator text_iter = text.cbegin();
compiledRegex = std::regex(regex, std::tr1::regex_constants::extended);
while (regex_search(text_iter, text.end(), results, compiledRegex))
{
    int count = results.size();
    // Alloc pointer array based on count * sizeof(mystruct).
    for ( std::cmatch::iterator group = results.begin();
          group != results.end();
          ++group )
    {
        // If you uses grouping in your search here you can access each group
    }
   std::cout << std::string(results[0].first, results[0].second) << endl;
   text_iter = results[0].second;
}

希望它能帮助