Как я могу получить доступ ко всем совпадениям группы повторного захвата, а не только к последней? - PullRequest
5 голосов
/ 17 мая 2010

Мой код:

#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 ]

2 голосов
/ 13 мая 2012

Вы не должны вызывать match.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] с «альфой» и сопоставляет [1] с «а» (последняя буква альфа - последняя найденная группа)

Чтобы получить все слово в группе, вы должны изменить шаблон на ([a-z] +) и повторно вызывать regex_search, как вы это делали в своем собственном ответе.

Извините, что отвечаю с опозданием на 2 года, но если кто-то погуглит здесь, как я, то, возможно, это все равно будет ему полезно ...

2 голосов
/ 17 мая 2010

Вот что я нашел до сих пор:

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

И все работает как положено. Может кто знает лучшее решение?

0 голосов
/ 19 июня 2014

Это работает для меня, может быть, кто-то найдет это полезным ..

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...