'/g'全局修饰符的std::regex等效形式

7
在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效果。那么,有没有好的方法来做到这一点,还是必须一遍又一遍地运行正则表达式?
1个回答

12
你应该多次调用regex_search。它的返回值指定是否还有其他匹配项。每次调用它都会得到一个新的匹配项。通过result返回的迭代器遍历你的正则表达式中定义的组子匹配项。第一个条目始终是整个匹配项,这就是为什么在你的情况下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;
}
希望它能有所帮助。

这基本上就是我最终得出的结论,我想我希望有一个标志可以让regex_search来完成它。可能你需要在每次迭代中将文本指针移动到最后一次匹配的结尾? - user159335
@JonB 你是对的。应该使用迭代器代替字符串。在每次迭代结束时,应该更新搜索迭代器,使用results[0].second。我已经相应地更新了我的答案。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接