如何访问重复捕获组的所有匹配项,而不仅仅是最后一个?

时间:2010-05-17 10:46:51

标签: c++ regex boost

我的代码是:

#include <boost/regex.hpp>
boost::cmatch matches;
boost::regex_match("alpha beta", matches, boost::regex("([a-z])+"));
cout << "found: " << matches.size() << endl;

它显示found: 2表示只发现一次出现...如何指示它找到三次出现?谢谢!

3 个答案:

答案 0 :(得分:2)

这是我到目前为止所发现的:

text = "alpha beta";
string::const_iterator begin = text.begin();
string::const_iterator end = text.end();
boost::match_results<string::const_iterator> what;
while (regex_search(begin, end, what, boost::regex("([a-z]+)"))) {
    cout << string(what[1].first, what[2].second-1);
    begin = what[0].second;
}

它按预期工作。也许有人知道更好的解决方案?

答案 1 :(得分:2)

在验证某些内容是否匹配之前,您不应该调用matches.size(),即您的代码看起来应该是这样的:

#include <boost/regex.hpp>
boost::cmatch matches;
if (boost::regex_match("alpha beta", matches, boost::regex("([a-z])+")))
    cout << "found: " << matches.size() << endl;
else
    cout << "nothing found" << endl;

输出将“无法找到”,因为regex_match尝试匹配整个字符串。你想要的可能是正在寻找子串的regex_search。下面的代码对您来说可能更好一点:

#include <boost/regex.hpp>
boost::cmatch matches;
if (boost::regex_search("alpha beta", matches, boost::regex("([a-z])+")))
    cout << "found: " << matches.size() << endl;
else
    cout << "nothing found" << endl;

但是只会输出“2”,即匹配[0]和“alpha”并将[1]与“a”匹配(alpha的最后一个字母 - 最后一组匹配)

要获得组中的整个单词,您必须将模式更改为([a-z] +)并重复调用regex_search,就像在自己的答案中一样。

很抱歉迟到2年回复,但如果有人像我一样在谷歌搜索,那么也许对他来说仍然有用......

答案 2 :(得分:0)

这对我有用,也许有人会发现它很有用..

std::string arg = "alpha beta";
boost::sregex_iterator it{arg.begin(), arg.end(), boost::regex("([a-z])+")};
boost::sregex_iterator end;
for (; it != end; ++it) {
  std::cout << *it << std::endl;
}

打印:

alpha
beta