Определены в типах regex и regex_constants::syntax_option_type | |
---|---|
error_collate | Недопустимый запрос объединения элементов |
error_ctype | Недопустимый класс символов |
error_escape | Недопустимый управляющий или замыкающий символ |
error_backref | Недопустимая обратная ссылка |
error_brack | Несоответствие квадратных скобок ([ или ] ) |
error_paren | Несоответствие круглых скобок (( или ) ) |
error_brace | Несоответствие фигурных скобок ({ или } ) |
error_badbrace | Недопустимый диапазон в фигурных скобках ({} ) |
error_range | Недопустимый диапазон символов (например, [z-a] ) |
error_space | Недостаточно памяти для выполнения этого регулярного выражения |
error_badrepeat | Повторяющийся символ (*? , + или { ) не предваряется допустимым регулярным выражением |
error_complexity | Затребованное соответствие слишком сложно |
error_stack | Недостаточно памяти для вычисления соответствия |
Например, в схеме вполне можно пропустить по неосторожности скобку:
try {
//
//
regex r("[[:alnum:]+\\.(cpp|схх|cc)$", regex::icase);
} catch (regex_error e)
{ cout << e.what() << "\ncode: " << e.code() << endl; }
При запуске на системе авторов эта программа выводит следующее:
regex_error(error_brack):
The expression contained mismatched [ and ].
code: 4
Компилятор определяет функцию-член code()
для возвращения позиции ошибок, перечисленных в табл. 17.7, счет которых, как обычно, начинается с нуля.
Как уже упоминалось, представляющая регулярное выражение "программа" компилируется во время выполнения, а не во время компиляции. Компиляция регулярного выражения может быть на удивление медленной операцией, особенно если используется расширенная грамматика регулярного выражения или выражение слишком сложно. В результате создание объекта класса regex
и присвоение нового регулярного выражения уже существующему объекту класса regex
может занять много времени. Для минимизации этих дополнительных затрат не создавайте больше объектов класса regex
, чем необходимо. В частности, если регулярное выражение используются в цикле, его следует создать вне цикла, избежав перекомпиляции при каждой итерации.
Поиск возможен в любой из исходных последовательностей нескольких типов. Входные данные могут быть обычными символами типа char
или wchar_t
, и эти символы могут храниться в библиотечной строке или в массиве символов (или в его версии для wchar_t
, или wstring
). Библиотека RE определяет отдельные типы, соответствующие этим разным типам исходных последовательностей.
Предположим, например, что класс regex
содержит регулярное выражение типа char
. Для типа wchar_t
библиотека определяет также класс wregex
, поддерживающий все операции класса regex
. Единственное различие в том, что инициализаторы класса wregex
должны использовать тип wchar_t
вместо типа char
.