Есть ли регулярные выражения в C++?
При программном сопоставлении строк со сколь угодно сложными шаблонами человечество пока не придумало ничего удобнее регулярных выражений, которые есть сегодня буквально везде (см. по ссылке).
Есть ли поддержка "регулярок" в C++? Да, есть, но только в новых стандартах C++11/14.
Пример по ссылке тоже неплох, но мы сделаем проще и наглядней. Проверено в Visual Studio 2015, должно работать примерно с 2013-й версии. Пространство имён std
подключено не только для <iostream>
, но и потому, что методы для работы с RegExp определены также в нём.
При работе в QT пятых версий для поддержки стандарта C++11 достаточно указать опцию
QMAKE_CXXFLAGS += -std=gnu++11
а лучше
CONFIG += c++11
в файле проекта .pro
.
#include <iostream> #include <string> #include <regex> using namespace std; int main() { string str = "helloW,world,hello, you are like the hell!"; //Строка для разбора string s(str); smatch m; //Контейнер для вхождений регулярного выражения regex e("\\b(hel)([^\\s\\.,\\?!:;]*)"); //Регулярка "слова, начинающиеся с букв "hel", разделённые пробелом или знаком препинания (не все знаки)" cout << "String: " << endl << s << endl; cout << "Whole words:" << endl; //Печатаем целые слова while (regex_search(s, m, e)) { cout << m[0] << endl; s = m.suffix().str(); } cout << "All matches:" << endl; //Печатаем списки всех найденных вхождений s = str; //Предыдущий разбор "испортил" строку s while (regex_search(s, m, e)) { for (auto x : m) cout << x << " "; cout << endl; s = m.suffix().str(); } cin.get(); return 0; }
17.05.2017, 21:44 [3738 просмотров]