Как вывести контейнер 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++ ;