Некорректно работает код с regex, cmatch
Пишу программу, в которой пользователь вводит строку, и если есть совпадение с регулярным выражением, то это совпадение выводится. Но я уже несколько раз меняла регулярное выражение те, в которых не может быть ошибки, но код не работает все равно. Ошибка где-то в if или for.
#include <iostream>
#include <string>
#include <regex>
int main() {
std::cout<< "Enter your text: ";
std::string text;
std::cout << "\n";
std::getline(std::cin, text);
/////////////////////
std::cmatch result;
std::regex probel ("([abcd])");
if (std::regex_match(text.c_str(), probel))
for(int i=0; i < result.size(); i++)
std::cout << result[i] << std::endl;
}
Пробовала и result писать в if, ничего не поменялось.
Ответы (1 шт):
Давайте попробуем быть логичными.
Вот представим себе, что я ничего не знаю о регулярных выражениях, а смотрю только на код.
я вижу, что переменная result типа cmatch объявлена, но до начала цикла даже инициализирована. Тогда по какой причине Вы ожидаете, что можете сделать цикл до result.size()?
Теперь попробуем сделать то, что Вы хотите.
Итак, regex_match() возвращает true, если в строке находится паттерн, заданный регулярным выражением.
Чтобы "пройти по всем вхождениям паттеран в строку" - как я понял, чаще используется regex_search()
Вот пример использования:
//string to be searched
string mystr = "She sells_sea shells in the sea shore";
// regex expression for pattern to be searched
regex regexp("s[a-z_]+");
// flag type for determining the matching behavior (in this case on string objects)
smatch m;
// regex_search that searches pattern regexp in the string mystr
regex_search(mystr, m, regexp);
cout<<"String that matches the pattern:"<<endl;
for (auto x : m)
cout << x << " ";
Я этот пример скопировал вот из этой статьи - прошу прощения, что на английском, но адекватного русского перевода мне не попалось.
Мне кажется, теперь Вы сможете решить свою задачу.
И еще один небольшой совет. Пока Вы учитесь, и не пишете программ промышленного уровня - Вы можете пользоваться using namespace std;, и Ваш код станет занчительно короче и обозримее - благодаря отсутствию префикса std:: буквально в каждой строке.