2016-03-17 5 views
1

Я новичок в библиотеке C++ regex. Я заметил, что, следуя документации на cplusplus.com, в своем примере условие, которое они использовали для завершения цикла итерации, всегда будет возвращать true, если я использую регулярное выражение, которое соответствует всей целевой последовательности. В идеале цикл должен совпадать один раз, а затем завершаться. Вот мой код:Почему мое регулярное выражение вызывает бесконечный цикл?

#include <iostream> 
#include <regex> 

int main() 
{ 
    std::string str("Foo bar"); 
    std::regex reg("(.|[\r\n])*"); // Match the whole string 

    std::regex_iterator<std::string::iterator> rit(str.begin(), str.end(), reg); 
    std::regex_iterator<std::string::iterator> rend; 

    while (rit != rend) // For some reason this is always true 
    { 
     std::cout << "Infinite loop!" << std::endl; 
     rit++; 
    } 

    return 0; 
} 

Что я делаю неправильно?

+2

Когда он достигает конца строки, он по-прежнему соответствует **, потому что ваш шаблон соответствует пустой строке **. Измените его на '' (. | [\ R \ n]) + "'. – paulotorrens

ответ

2

Непознанное должно быть проверено, но я считаю, что ваш * означает 0 или больше. Таким образом, он может навсегда совпадать с 0 в конце строки.

+0

Конечно! Самые простые ошибки являются наиболее неуловимыми ... –

Смежные вопросы