Как вывести контейнер smatch

#include <regex>
#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {
    std::cout << "Введите строку. Ее мы проверим на предмет смайликов: " << std::endl;
    string smile;
    std::cin >> smile;
    regex haha("[;:]-*[\)\(\]\[]+");
    smatch sovpadenie;
    regex_match(smile, sovpadenie, haha);
    for(int i = 0; i < sovpadenie.size(); i++)
    {
        std::cout << sovpadenie[i];
    }
    return 0;
}

Проблема в том, что у меня не выводится содержимое контейнера. Как сделать так, чтобы узнать результат? Программа просто завершается с кодом 0.


Ответы (1 шт):

Автор решения: needKVAS

В первую очередь у вас неправильно составлено регулярное выражение. Правильнее будет так:

 std::regex haha("[;:]-?[()\\]\\[]+");

Помимо этого, метод std::regex_match ищет полное совпадение с шаблоном, поэтому для строк, которые кроме искомых выражений содержат что-то ещё, он не найдёт ничего. Для этих целей лучше использовать std::regex_search.

Ещё хочется отметить, что std::smatch содержит одно совпадение и совпадения внутри этого совпадения. Для поиска всех вхождений выражения можно использовать std::regex_token_iterator.

//Конструктор по умолчанию указывает на конец последовательности
std::regex_token_iterator<std::string::iterator> rend; 
std::regex_token_iterator<std::string::iterator> a(smile.begin(),smile.end(),haha);
while (a!=rend) std::cout <<  *a++ ;
→ Ссылка