2010-05-17 1 views
5

Мой код:Как получить доступ ко всем совпадениям группы повторного захвата, а не только к последней?

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

И это показывает found: 2 что означает, что только в одном случае нашли ... Как инструктировать его найти три вхождения? Благодаря!

ответ

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

И это работает, как ожидалось. Может быть, кто-то знает лучшее решение?

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] с «альфа» и спичек [1] ​​с «а» (последняя буква альфа - последняя сопоставленная группа)

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

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

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 
Смежные вопросы