Затем происходит вызов функции 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. Причины ошибок в регулярном выражении