Затем происходит вызов функции regex_search(). Если она находит соответствие, то возвращает значение true. Для вывода части строки test_str, соответствующей заданной схеме, используется функция-член str() объекта results. Функция regex_search() прекращает поиск, как только находит в исходной последовательности соответствующую подстроку. В результате вывод будет таким:
freind
Поиск всех соответствий во вводе представлен в разделе 17.3.2.
regexПри определении объекта класса regex или вызове его функции assign() для присвоения ему нового значения можно применить один или несколько флагов, влияющих на работу объекта класса regex. Эти флаги контролируют обработку, осуществляемую этим объектом. Последние шесть флагов, указанных в табл. 17.6, задают язык, на котором написано регулярное выражение. Установлен должен быть только один из флагов определения языка. По умолчанию установлен флаг ECMAScript, задающий использование объектом класса regex спецификации ЕСМА-262, являющейся языком регулярных выражений большинства веб-браузеров.
Другие три флага позволяют определять независимые от языка аспекты обработки регулярного выражения. Например, можно указать, что поиск регулярного выражения не будет зависеть от регистра символов.
В качестве примера используем флаг icase для поиска имен файлов с указанными расширениями. Большинство операционных систем распознают расширения без учета регистра символов: программа С++ может быть сохранена в файле с расширением .cc, .Cc, .cC или .CC. Давайте напишем регулярное выражение для распознавания любого из них наряду с другими общепринятыми расширениями файлов:
//
//
regex r("[[:alnum:]]+\\.(cpp|схх|cc)$", regex::icase);
smatch results;
string filename;
while (cin >> filename)
if (regex_search(filename, results, r))
cout << results.str() << endl; //
Это выражение будет соответствовать строке из одного или нескольких символов или цифр, сопровождаемых точкой и одним из трех расширений файла. Регулярное выражение будет соответствовать расширению файлов независимо от регистра.
Подобно тому, как специальные символы есть в языке С++ (см. раздел 2.1.3), у языков регулярных выражений, как правило, тоже есть специальные символы. Например, точка (.) обычно соответствует любому символу. Как и в языке С++, для обозначения специального характера символа его предваряют символом наклонной черты. Поскольку наклонная черта влево является также специальным символом в языке С++, в строковом литерале языка С++, означающем наклонную черту влево следует использовать вторую наклонную черту влево. Следовательно, чтобы представить точку в регулярном выражении, необходимо написать \\..
Регулярное выражение можно считать самостоятельной "программой" на простом языке программирования. Этот язык не интерпретируется компилятором С++, и "компилируется" только во время выполнения, когда объект класса regex инициализируется или присваивается. Как и в любой написанной программе, в регулярных выражениях вполне возможны ошибки.
Если допустить ошибку в записи регулярного выражения, то передача исключения (см. раздел 5.6) типа regex_error произойдет только regex_error есть функция what(), описывающая произошедшую ошибку (см. раздел 5.6.2). У исключения regex_error есть также функция-член code(), возвращающая числовой код (зависящий от реализации), соответствующий типу произошедшей ошибки. Стандартные сообщения об ошибках, которые могут быть переданы библиотекой RE, приведены в табл. 17.7.
Таблица 17.7. Причины ошибок в регулярном выражении