2013-05-23 2 views
1

Я пытаюсь получить некоторые совпадения из файла, читая его по строкам. Мой код заключается в следующем:C++ получить совпадения от regex_iterator

std::regex e("id=\"(.+?)\"|title=\"(.+?)\"|summary=\"(.+?)\"|first=\"(.+?)\"|last=\"(.+?)\""); 
std::regex_iterator<std::string::iterator> rit (line.begin(), line.end(), e); 
std::regex_iterator<std::string::iterator> rend; 

while (rit!=rend) { 
    std::cout << rit->str() << std::endl; 
    ++rit; 
} 

Я попытался с помощью regex_search и smatch объекта, но он останавливается в первом матче линии. Я обнаружил, что regex_iterator выполняет задание, но он дает мне полное соответствие (например, id = «123456», а не 123456), что имеет смысл, но мне нужен только номер.

В соответствии с http://www.cplusplus.com/reference/regex/regex_iterator/operator */именованием, по которому итератор выдаст мне объект match_results, но я не знаю, как объявить его (он всегда дает мне список плохих аргументов. Как я могу заставить итератор дать мне smatch-объект ?

+1

Последнее, что я слышал, g ++ regex пока не работает. –

ответ

0

Вы, возможно, придется петлю над матчами, вызывая regex_match каждый раз, чтобы получить обновленный match_results объект каждый раз.

3

Вызов str() на match_results объекта возвращает весь матч текущего. для того, чтобы увидеть отдельные submatches, пройти индекс в вызове:

for (int i = 0; i < rit->size(); ++i) 
    std::cout << rit->str(i) << '\n'; 
Смежные вопросы