В этом разделе описаны компоненты, которые программы C ++ могут использовать для выполнения операций, связанных с сопоставлением и поиском регулярных выражений.
Следующие подпункты описывают базовый шаблон класса регулярного выражения и его характеристики, которые могут обрабатывать char-like аргументы шаблона, две специализации этого шаблона класса, которые обрабатывают последовательности char и wchar_t, шаблон класса, который содержит результат совпадения регулярного выражения, серию алгоритмов, которые позволяют последовательность символов, с которой будет работать регулярное выражение, и два типа итераторов для перечисления совпадений регулярных выражений, как описано в Табл 128.
Подпункт | Заголовок (ы) | |
[re.def] | Определения | |
[re.req] | Требования | |
[re.const] | Константы | |
[re.badexp] | Тип исключения | |
[re.traits] | Черты | |
[re.regex] | Шаблон регулярного выражения | <regex> |
[re.submatch] | Подматчи | |
[re.results] | Результаты матчей | |
[re.alg] | Алгоритмы | |
[re.iter] | Итераторы | |
[re.grammar] | Грамматика |
последовательность из одного или нескольких символов в текущем языковом стандарте, которые сопоставляются, как если бы они были одним символом.
неопределенная структура данных, которая используется для представления регулярного выражения и позволяет получать эффективные сопоставления с регулярным выражением.
последовательность из одного или нескольких символов, которая должна быть заменена некоторой частью совпадения регулярного выражения.
последовательность из нуля или более символов соответствует регулярному выражению, когда символы в последовательности соответствуют последовательности символов, определенной шаблоном.
набор из одного или нескольких символов, которые имеют один и тот же первичный ключ сортировки: это вес ключа сортировки, который зависит только от формы символа, а не от акцентов, регистра или языковых настроек.
шаблон, который выбирает определенные строки из набора символьных строк.
подмножество регулярного выражения, отмеченное круглыми скобками.
В этом подпункте определены требования к классам, представляющим признаки регулярных выражений. [ Note: Шаблон класса regex_traits, определенный в пункте [re.traits], удовлетворяет этим требованиям. ] — end note
Шаблон класса basic_regex, определенный в пункте [re.regex], требует набора связанных типов и функций для завершения определения его семантики. Эти типы и функции предоставляются как набор членов typedef-names и функций в параметре шаблона, traits используемом basic_regex шаблоном класса. В этом подпункте определяется семантика этих членов.
Чтобы специализировать шаблон класса basic_regex для символьного контейнера CharT и связанного с ним класса признаков регулярного выражения Traits, используйте basic_regex<CharT, Traits>.
В таблице 129 X обозначен класс признаков, определяющий типы и функции для символьного типа контейнера charT; u это объект типа X; v это объект типа const X; p это значение типа const charT*; I1 и I2 есть input iterators; F1 и F2 есть forward iterators; c это значение типа const charT; s это объект типа X::string_type; cs это объект типа const X::string_type; b это значение типа bool; I это значение типа int; cl является объектом типа X::char_class_typeи loc является объектом типа X::locale_type.
Выражение | Тип возврата | Утверждение / примечание до / после условия |
X::char_type | charT | Тип символьного контейнера, используемый в реализации шаблона класса basic_regex. |
X::string_type | basic_string<charT> | |
X::locale_type | Копируемый конструктивный тип | Тип, представляющий локаль, используемую классом свойств. |
X::char_class_type | bitmask type. | Тип битовой маски, представляющий определенную классификацию символов. |
X::length(p) | size_t | Дает наименьшее i такое, что p[i] == 0. Сложность линейна i . |
v.translate(c) | X::char_type | Возвращает такой символ, что для любого символа, d который должен считаться эквивалентным c then v.translate(c) == v.translate(d). |
v.translate_nocase(c) | X::char_type | Тогда для всех символов C , которые должны считаться эквивалентными, c когда сравнения должны выполняться без учета регистра v.translate_nocase(c) == v.translate_nocase(C). |
v.transform(F1, F2) | X::string_type | Возвращает ключ сортировки для последовательности символов, обозначенной диапазоном итератора [F1, F2) , так что если последовательность символов [G1, G2) сортируется до последовательности символов, [H1, H2) тогда v.transform(G1, G2) < v.transform(H1, H2). |
v.transform_primary(F1, F2) | X::string_type | Возвращает ключ сортировки для последовательности символов, обозначенной диапазоном итератора [F1, F2) , так что если последовательность символов [G1, G2) сортируется до последовательности [H1, H2) символов, тогда регистр символов не учитывается v.transform_primary(G1, G2) < v.transform_primary(H1, H2). |
v.lookup_collatename(F1, F2) | X::string_type | Возвращает последовательность символов, представляющую элемент сортировки, состоящий из последовательности символов, обозначенной диапазоном итератора [F1, F2). Возвращает пустую строку, если последовательность символов не является допустимым элементом сортировки. |
v.lookup_classname(F1, F2, b) | X::char_class_type | Преобразует последовательность символов, указанную диапазоном итератора, [F1, F2) в значение типа битовой маски, которое впоследствии может быть передано isctype. Значения, возвращаемые из, lookup_classname могут быть побитовыми или объединены вместе; результирующее значение представляет членство в любом из соответствующих классов символов. Если b есть true, то возвращаемая битовая маска подходит для сопоставления символов независимо от их регистра. Возвращает, 0 если последовательность символов не является именем класса символов, распознаваемого X. Возвращаемое значение не должно зависеть от регистра символов в последовательности. |
v.isctype(c, cl) | bool | Возвращает, true если персонаж c является членом одного из классов символов, обозначенных cl, в false противном случае. |
v.value(c, I) | int | Возвращает значение, представленное цифрой c в базе, I если символ c является допустимой цифрой в базе I; в противном случае возвращается -1. [ Note: Значение I будет только 8, 10 или 16. ] — end note |
u.imbue(loc) | X::locale_type | Наполняет u языковой стандарт loc и возвращает предыдущий языковой стандарт, который использовался, u если он есть. |
v.getloc() | X::locale_type | Возвращает текущий языковой стандарт v, если таковой имеется. |
[ Note: Шаблон класса regex_traits удовлетворяет требованиям для класса признаков регулярного выражения, если он специализирован для char или wchar_t. Этот шаблон класса описан в заголовке <regex>и описан в пункте [re.traits]. ] — end note
#include <initializer_list> namespace std { // [re.const], regex constants namespace regex_constants { using syntax_option_type = T1; using match_flag_type = T2; using error_type = T3; } // [re.badexp], class regex_error class regex_error; // [re.traits], class template regex_traits template <class charT> struct regex_traits; // [re.regex], class template basic_regex template <class charT, class traits = regex_traits<charT>> class basic_regex; using regex = basic_regex<char>; using wregex = basic_regex<wchar_t>; // [re.regex.swap], basic_regex swap template <class charT, class traits> void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2); // [re.submatch], class template sub_match template <class BidirectionalIterator> class sub_match; using csub_match = sub_match<const char*>; using wcsub_match = sub_match<const wchar_t*>; using ssub_match = sub_match<string::const_iterator>; using wssub_match = sub_match<wstring::const_iterator>; // [re.submatch.op], sub_match non-member operators template <class BiIter> bool operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); template <class BiIter, class ST, class SA> bool operator==( const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, const sub_match<BiIter>& rhs); template <class BiIter, class ST, class SA> bool operator!=( const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, const sub_match<BiIter>& rhs); template <class BiIter, class ST, class SA> bool operator<( const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, const sub_match<BiIter>& rhs); template <class BiIter, class ST, class SA> bool operator>( const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, const sub_match<BiIter>& rhs); template <class BiIter, class ST, class SA> bool operator>=( const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, const sub_match<BiIter>& rhs); template <class BiIter, class ST, class SA> bool operator<=( const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, const sub_match<BiIter>& rhs); template <class BiIter, class ST, class SA> bool operator==( const sub_match<BiIter>& lhs, const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); template <class BiIter, class ST, class SA> bool operator!=( const sub_match<BiIter>& lhs, const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); template <class BiIter, class ST, class SA> bool operator<( const sub_match<BiIter>& lhs, const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); template <class BiIter, class ST, class SA> bool operator>( const sub_match<BiIter>& lhs, const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); template <class BiIter, class ST, class SA> bool operator>=( const sub_match<BiIter>& lhs, const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); template <class BiIter, class ST, class SA> bool operator<=( const sub_match<BiIter>& lhs, const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); template <class BiIter> bool operator==(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator!=(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator<(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator>(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator>=(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator<=(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator==(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs); template <class BiIter> bool operator!=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs); template <class BiIter> bool operator<(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs); template <class BiIter> bool operator>(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs); template <class BiIter> bool operator>=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs); template <class BiIter> bool operator<=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs); template <class BiIter> bool operator==(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator!=(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator<(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator>(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator>=(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator<=(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs); template <class BiIter> bool operator==(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs); template <class BiIter> bool operator!=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs); template <class BiIter> bool operator<(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs); template <class BiIter> bool operator>(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs); template <class BiIter> bool operator>=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs); template <class BiIter> bool operator<=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs); template <class charT, class ST, class BiIter> basic_ostream<charT, ST>& operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m); // [re.results], class template match_results template <class BidirectionalIterator, class Allocator = allocator<sub_match<BidirectionalIterator>>> class match_results; using cmatch = match_results<const char*>; using wcmatch = match_results<const wchar_t*>; using smatch = match_results<string::const_iterator>; using wsmatch = match_results<wstring::const_iterator>; // match_results comparisons template <class BidirectionalIterator, class Allocator> bool operator==(const match_results<BidirectionalIterator, Allocator>& m1, const match_results<BidirectionalIterator, Allocator>& m2); template <class BidirectionalIterator, class Allocator> bool operator!=(const match_results<BidirectionalIterator, Allocator>& m1, const match_results<BidirectionalIterator, Allocator>& m2); // [re.results.swap], match_results swap template <class BidirectionalIterator, class Allocator> void swap(match_results<BidirectionalIterator, Allocator>& m1, match_results<BidirectionalIterator, Allocator>& m2); // [re.alg.match], function template regex_match template <class BidirectionalIterator, class Allocator, class charT, class traits> bool regex_match(BidirectionalIterator first, BidirectionalIterator last, match_results<BidirectionalIterator, Allocator>& m, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class BidirectionalIterator, class charT, class traits> bool regex_match(BidirectionalIterator first, BidirectionalIterator last, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class charT, class Allocator, class traits> bool regex_match(const charT* str, match_results<const charT*, Allocator>& m, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class ST, class SA, class Allocator, class charT, class traits> bool regex_match(const basic_string<charT, ST, SA>& s, match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class ST, class SA, class Allocator, class charT, class traits> bool regex_match(const basic_string<charT, ST, SA>&&, match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>&, const basic_regex<charT, traits>&, regex_constants::match_flag_type = regex_constants::match_default) = delete; template <class charT, class traits> bool regex_match(const charT* str, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class ST, class SA, class charT, class traits> bool regex_match(const basic_string<charT, ST, SA>& s, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); // [re.alg.search], function template regex_search template <class BidirectionalIterator, class Allocator, class charT, class traits> bool regex_search(BidirectionalIterator first, BidirectionalIterator last, match_results<BidirectionalIterator, Allocator>& m, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class BidirectionalIterator, class charT, class traits> bool regex_search(BidirectionalIterator first, BidirectionalIterator last, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class charT, class Allocator, class traits> bool regex_search(const charT* str, match_results<const charT*, Allocator>& m, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class charT, class traits> bool regex_search(const charT* str, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class ST, class SA, class charT, class traits> bool regex_search(const basic_string<charT, ST, SA>& s, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class ST, class SA, class Allocator, class charT, class traits> bool regex_search(const basic_string<charT, ST, SA>& s, match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, const basic_regex<charT, traits>& e, regex_constants::match_flag_type flags = regex_constants::match_default); template <class ST, class SA, class Allocator, class charT, class traits> bool regex_search(const basic_string<charT, ST, SA>&&, match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>&, const basic_regex<charT, traits>&, regex_constants::match_flag_type = regex_constants::match_default) = delete; // [re.alg.replace], function template regex_replace template <class OutputIterator, class BidirectionalIterator, class traits, class charT, class ST, class SA> OutputIterator regex_replace(OutputIterator out, BidirectionalIterator first, BidirectionalIterator last, const basic_regex<charT, traits>& e, const basic_string<charT, ST, SA>& fmt, regex_constants::match_flag_type flags = regex_constants::match_default); template <class OutputIterator, class BidirectionalIterator, class traits, class charT> OutputIterator regex_replace(OutputIterator out, BidirectionalIterator first, BidirectionalIterator last, const basic_regex<charT, traits>& e, const charT* fmt, regex_constants::match_flag_type flags = regex_constants::match_default); template <class traits, class charT, class ST, class SA, class FST, class FSA> basic_string<charT, ST, SA> regex_replace(const basic_string<charT, ST, SA>& s, const basic_regex<charT, traits>& e, const basic_string<charT, FST, FSA>& fmt, regex_constants::match_flag_type flags = regex_constants::match_default); template <class traits, class charT, class ST, class SA> basic_string<charT, ST, SA> regex_replace(const basic_string<charT, ST, SA>& s, const basic_regex<charT, traits>& e, const charT* fmt, regex_constants::match_flag_type flags = regex_constants::match_default); template <class traits, class charT, class ST, class SA> basic_string<charT> regex_replace(const charT* s, const basic_regex<charT, traits>& e, const basic_string<charT, ST, SA>& fmt, regex_constants::match_flag_type flags = regex_constants::match_default); template <class traits, class charT> basic_string<charT> regex_replace(const charT* s, const basic_regex<charT, traits>& e, const charT* fmt, regex_constants::match_flag_type flags = regex_constants::match_default); // [re.regiter], class template regex_iterator template <class BidirectionalIterator, class charT = typename iterator_traits<BidirectionalIterator>::value_type, class traits = regex_traits<charT>> class regex_iterator; using cregex_iterator = regex_iterator<const char*>; using wcregex_iterator = regex_iterator<const wchar_t*>; using sregex_iterator = regex_iterator<string::const_iterator>; using wsregex_iterator = regex_iterator<wstring::const_iterator>; // [re.tokiter], class template regex_token_iterator template <class BidirectionalIterator, class charT = typename iterator_traits<BidirectionalIterator>::value_type, class traits = regex_traits<charT>> class regex_token_iterator; using cregex_token_iterator = regex_token_iterator<const char*>; using wcregex_token_iterator = regex_token_iterator<const wchar_t*>; using sregex_token_iterator = regex_token_iterator<string::const_iterator>; using wsregex_token_iterator = regex_token_iterator<wstring::const_iterator>; namespace pmr { template <class BidirectionalIterator> using match_results = std::match_results<BidirectionalIterator, polymorphic_allocator<sub_match<BidirectionalIterator>>>; using cmatch = match_results<const char*>; using wcmatch = match_results<const wchar_t*>; using smatch = match_results<string::const_iterator>; using wsmatch = match_results<wstring::const_iterator>; } }
Пространство имен std::regex_constants содержит символические константы, используемые библиотекой регулярных выражений. Это пространство имен обеспечивает три типа, syntax_option_type, match_flag_type, и error_type, вместе с несколькими константами этих типов.
namespace std::regex_constants { using syntax_option_type = T1; inline constexpr syntax_option_type icase = unspecified; inline constexpr syntax_option_type nosubs = unspecified; inline constexpr syntax_option_type optimize = unspecified; inline constexpr syntax_option_type collate = unspecified; inline constexpr syntax_option_type ECMAScript = unspecified; inline constexpr syntax_option_type basic = unspecified; inline constexpr syntax_option_type extended = unspecified; inline constexpr syntax_option_type awk = unspecified; inline constexpr syntax_option_type grep = unspecified; inline constexpr syntax_option_type egrep = unspecified; inline constexpr syntax_option_type multiline = unspecified; }
Тип syntax_option_type определяется реализацией bitmask type. Установка его элементов имеет эффекты, перечисленные в Табл 130. Действительное значение типа syntax_option_type должно иметь максимум один из элементов грамматики ECMAScript, basic, extended, awk, grep, egrep, множество. Если элемент грамматики не установлен, используется грамматика по умолчанию ECMAScript.
Элемент | Эффект (ы), если установлен |
icase | Указывает, что сопоставление регулярных выражений с последовательностью контейнера символов должно выполняться без учета регистра. |
nosubs | Указывает, что никакие подвыражения не должны считаться отмеченными, так что, когда регулярное выражение сопоставляется с последовательностью контейнера символов, совпадения подвыражений не должны сохраняться в предоставленной match_results структуре. |
optimize | Указывает, что обработчик регулярных выражений должен уделять больше внимания скорости сопоставления регулярных выражений и меньше - скорости, с которой создаются объекты регулярных выражений. В противном случае это не оказывает заметного влияния на вывод программы. |
collate | Указывает, что диапазоны символов формы "[a-b]" должны быть чувствительны к языку. |
ECMAScript | Указывает, что грамматика, распознаваемая обработчиком регулярных выражений, должна соответствовать грамматике, используемой ECMAScript в ECMA-262, как изменено в [re.grammar]. |
basic | Указывает, что грамматика, распознаваемая механизмом регулярных выражений, должна быть грамматикой, используемой базовыми регулярными выражениями в POSIX, Базовые определения и заголовки, Раздел 9, Регулярные выражения. |
extended | Указывает, что грамматика, распознаваемая обработчиком регулярных выражений, должна быть грамматикой, используемой расширенными регулярными выражениями в POSIX, Базовые определения и заголовки, Раздел 9, Регулярные выражения. |
awk | Указывает, что грамматика, распознаваемая обработчиком регулярных выражений, должна соответствовать грамматике, используемой утилитой awk в POSIX. |
grep | Указывает, что грамматика, распознаваемая обработчиком регулярных выражений, должна соответствовать грамматике, используемой утилитой grep в POSIX. |
egrep | Указывает, что грамматика, распознаваемая обработчиком регулярных выражений, должна соответствовать грамматике, используемой утилитой grep, если задана опция -E в POSIX. |
multiline | Указывает, что ^ должно соответствовать началу строки и $ должно соответствовать концу строки, если ECMAScript выбран двигатель. |
namespace std::regex_constants { using match_flag_type = T2; inline constexpr match_flag_type match_default = {}; inline constexpr match_flag_type match_not_bol = unspecified; inline constexpr match_flag_type match_not_eol = unspecified; inline constexpr match_flag_type match_not_bow = unspecified; inline constexpr match_flag_type match_not_eow = unspecified; inline constexpr match_flag_type match_any = unspecified; inline constexpr match_flag_type match_not_null = unspecified; inline constexpr match_flag_type match_continuous = unspecified; inline constexpr match_flag_type match_prev_avail = unspecified; inline constexpr match_flag_type format_default = {}; inline constexpr match_flag_type format_sed = unspecified; inline constexpr match_flag_type format_no_copy = unspecified; inline constexpr match_flag_type format_first_only = unspecified; }
Тип match_flag_type определяется реализацией bitmask type. Константы этого типа, за исключением match_default и format_default, являются элементами битовой маски. Константы match_default и format_default являются пустыми битовыми масками. Сопоставление регулярного выражения с последовательностью символов [first, last) происходит в соответствии с правилами грамматики, указанной для объекта регулярного выражения, измененными в соответствии с эффектами, перечисленными в таблице 131 для любого набора элементов битовой маски.
Элемент | Эффект (ы), если установлен |
match_not_bol |
Первый символ в последовательности [first, last) следует рассматривать так, как будто он не находится в начале строки, поэтому символ
^ в регулярном выражении не должен совпадать [first, first).
|
match_not_eol |
Последний символ в последовательности [first, last) должен рассматриваться так, как если бы он не находился в конце строки, поэтому символ
"$" в регулярном выражении не должен совпадать [last, last).
|
match_not_bow |
Выражение "\\b" не должно соответствовать подпоследовательности [first, first).
|
match_not_eow |
Выражение "\\b" не должно соответствовать подпоследовательности [last, last).
|
match_any | Если возможно более одного совпадения, то приемлемым результатом будет любое совпадение. |
match_not_null | Выражение не должно соответствовать пустой последовательности. |
match_continuous | Выражение должно соответствовать только подпоследовательности, которая начинается с first. |
match_prev_avail |
--first - допустимая позиция итератора. Когда этот флаг установлен, флаги match_not_bol и match_not_bow должны игнорироваться клавишами
regular expression algorithms и iterators.
|
format_default | Когда совпадение регулярного выражения должно быть заменено новой строкой, новая строка должна быть построена с использованием правил, используемых функцией замены ECMAScript в ECMA-262, часть 15.5.4.11 String.prototype.replace. Кроме того, во время операций поиска и замены все неперекрывающиеся вхождения регулярного выражения должны быть обнаружены и заменены, а разделы ввода, которые не соответствуют выражению, должны быть скопированы без изменений в выходную строку. |
format_sed | Когда совпадение регулярного выражения должно быть заменено новой строкой, новая строка должна быть построена с использованием правил, используемых утилитой sed в POSIX. |
format_no_copy | Во время операции поиска и замены разделы просматриваемой последовательности контейнеров символов, которые не соответствуют регулярному выражению, не должны копироваться в выходную строку. |
format_first_only | Если указано во время операции поиска и замены, заменяется только первое вхождение регулярного выражения. |
namespace std::regex_constants { using error_type = T3; inline constexpr error_type error_collate = unspecified; inline constexpr error_type error_ctype = unspecified; inline constexpr error_type error_escape = unspecified; inline constexpr error_type error_backref = unspecified; inline constexpr error_type error_brack = unspecified; inline constexpr error_type error_paren = unspecified; inline constexpr error_type error_brace = unspecified; inline constexpr error_type error_badbrace = unspecified; inline constexpr error_type error_range = unspecified; inline constexpr error_type error_space = unspecified; inline constexpr error_type error_badrepeat = unspecified; inline constexpr error_type error_complexity = unspecified; inline constexpr error_type error_stack = unspecified; }
Тип error_type определяется реализацией enumerated type. Значения типа error_type представляют условия ошибки, описанные в таблице 132:
Ценить | Состояние ошибки |
error_collate | Выражение содержало недопустимое имя элемента сортировки. |
error_ctype | Выражение содержало недопустимое имя класса символов. |
error_escape | Выражение содержало недопустимый экранированный символ или завершающий escape-символ. |
error_backref | Выражение содержит недопустимую обратную ссылку. |
error_brack |
Выражение содержит несоответствующие [ и ] . |
error_paren |
Выражение содержит несоответствующие ( и ) . |
error_brace |
Выражение содержало несоответствие { и } |
error_badbrace |
Выражение содержит недопустимый диапазон в {} выражении. |
error_range |
Выражение содержит недопустимый диапазон символов, как
[b-a] в большинстве кодировок. |
error_space | Недостаточно памяти для преобразования выражения в конечный автомат. |
error_badrepeat |
Одному из *?+{ не предшествовало действительное регулярное выражение. |
error_complexity | Сложность попытки сопоставления с регулярным выражением превышает заранее установленный уровень. |
error_stack | Недостаточно памяти для определения соответствия регулярного выражения указанной последовательности символов. |
class regex_error : public runtime_error { public: explicit regex_error(regex_constants::error_type ecode); regex_constants::error_type code() const; };
Класс regex_error определяет тип объектов, создаваемых как исключения для сообщения об ошибках из библиотеки регулярных выражений.
regex_error(regex_constants::error_type ecode);
regex_constants::error_type code() const;
namespace std {
template <class charT>
struct regex_traits {
using char_type = charT;
using string_type = basic_string<char_type>;
using locale_type = locale;
using char_class_type = bitmask_type;
regex_traits();
static size_t length(const char_type* p);
charT translate(charT c) const;
charT translate_nocase(charT c) const;
template <class ForwardIterator>
string_type transform(ForwardIterator first, ForwardIterator last) const;
template <class ForwardIterator>
string_type transform_primary(
ForwardIterator first, ForwardIterator last) const;
template <class ForwardIterator>
string_type lookup_collatename(
ForwardIterator first, ForwardIterator last) const;
template <class ForwardIterator>
char_class_type lookup_classname(
ForwardIterator first, ForwardIterator last, bool icase = false) const;
bool isctype(charT c, char_class_type f) const;
int value(charT ch, int radix) const;
locale_type imbue(locale_type l);
locale_type getloc() const;
};
}
Специализации regex_traits<char> и regex_traits<wchar_t> должны быть действительными и должны удовлетворять требованиям, предъявляемым к классу свойств регулярного выражения ([re.req]).
using char_class_type = bitmask_type;
Тип char_class_type используется для представления классификации символов и может содержать набор для конкретной реализации, возвращаемый функцией lookup_classname.
static size_t length(const char_type* p);
charT translate(charT c) const;
charT translate_nocase(charT c) const;
template <class ForwardIterator>
string_type transform(ForwardIterator first, ForwardIterator last) const;
Effects: Как будто по:
string_type str(first, last); return use_facet<collate<charT>>( getloc()).transform(&*str.begin(), &*str.begin() + str.length());
template <class ForwardIterator>
string_type transform_primary(ForwardIterator first, ForwardIterator last) const;
Effects: Если
typeid(use_facet<collate<charT>>) == typeid(collate_byname<charT>)
и форма ключа сортировки, возвращаемого функцией collate_byname<charT>::transform(first, last) , известна и может быть преобразована в первичный ключ сортировки, затем возвращается этот ключ, в противном случае возвращается пустая строка.
template <class ForwardIterator>
string_type lookup_collatename(ForwardIterator first, ForwardIterator last) const;
Returns: последовательность из одного или нескольких символов, представляющая элемент сортировки, состоящий из последовательности символов, обозначенной диапазоном итератора [first, last). Возвращает пустую строку, если последовательность символов не является допустимым элементом сортировки.
template <class ForwardIterator>
char_class_type lookup_classname(
ForwardIterator first, ForwardIterator last, bool icase = false) const;
Returns: неопределенное значение, представляющее классификацию символов, названную последовательностью символов, обозначенной диапазоном итератора [first, last). Если параметр icase равен, true то возвращаемая маска идентифицирует классификацию символов без учета регистра сопоставляемых символов, в противном случае учитывает регистр сопоставляемых символов.329 Возвращаемое значение не должно зависеть от регистра символов в последовательности символов. Если имя не распознано, возвращается char_class_type().
bool isctype(charT c, char_class_type f) const;
Returns: Учитывая следующее объявление функции:
// for exposition only
template<class C>
ctype_base::mask convert(typename regex_traits<C>::char_class_type f);
который возвращает значение, в котором установлено каждое ctype_base::mask значение, соответствующее значению в f названии в таблице 133 , тогда результат определяется, как если бы:
ctype_base::mask m = convert<charT>(f); const ctype<charT>& ct = use_facet<ctype<charT>>(getloc()); if (ct.is(m, c)) { return true; } else if (c == ct.widen('_')) { charT w[1] = { ct.widen('w') }; char_class_type x = lookup_classname(w, w+1); return (f&x) == x; } else { return false; }
[ Example:
regex_traits<char> t;
string d("d");
string u("upper");
regex_traits<char>::char_class_type f;
f = t.lookup_classname(d.begin(), d.end());
f |= t.lookup_classname(u.begin(), u.end());
ctype_base::mask m = convert<char>(f); // m == ctype_base::digit|ctype_base::upper
— end example ] [ Example:
regex_traits<char> t; string w("w"); regex_traits<char>::char_class_type f; f = t.lookup_classname(w.begin(), w.end()); t.isctype('A', f); // returns true t.isctype('_', f); // returns true t.isctype(' ', f); // returns false
— end example ]
int value(charT ch, int radix) const;
Returns: значение, представленное цифрой ch в базе, radix если символ ch является действительной цифрой в базе radix; в противном случае возвращается -1.
locale_type imbue(locale_type loc);
Effects: Наполняет this копией локали loc. [ Note: Вызов imbue с локалью, отличной от используемой в настоящее время, делает недействительными все кэшированные данные, хранящиеся в *this. ] — end note
Returns: если языковой стандарт ранее не был добавлен, то копия глобального языкового стандарта, действующего на момент создания *this, в противном случае - копия последнего переданного аргумента imbue.
locale_type getloc() const;
Returns: если языковой стандарт не был добавлен, то копия глобального языкового стандарта, действующего на момент создания *this, в противном случае - копия последнего переданного аргумента imbue.
Узкое имя персонажа | Имя широкого символа | Соответствующее ctype_base::mask значение |
"alnum" | L"alnum" | ctype_base::alnum |
"alpha" | L"alpha" | ctype_base::alpha |
"blank" | L"blank" | ctype_base::blank |
"cntrl" | L"cntrl" | ctype_base::cntrl |
"digit" | L"digit" | ctype_base::digit |
"d" | L"d" | ctype_base::digit |
"graph" | L"graph" | ctype_base::graph |
"lower" | L"lower" | ctype_base::lower |
"print" | L"print" | ctype_base::print |
"punct" | L"punct" | ctype_base::punct |
"space" | L"space" | ctype_base::space |
"s" | L"s" | ctype_base::space |
"upper" | L"upper" | ctype_base::upper |
"w" | L"w" | ctype_base::alnum |
"xdigit" | L"xdigit" | ctype_base::xdigit |
Например, если параметр icase является true то [[:lower:]] такой же , как [[:alpha:]].
Для символьного типа charTспециализации шаблона класса basic_regex представляют собой регулярные выражения, построенные из символьных последовательностей charT символов. В остальном [re.regex], charT обозначает данный символьный тип. Хранилище для регулярного выражения выделяется и освобождается по мере необходимости функциями-членами класса basic_regex.
Объекты со специализацией типа basic_regex отвечают за преобразование последовательности charT объектов во внутреннее представление. Не указано, какую форму принимает это представление и как к нему обращаются алгоритмы, работающие с регулярными выражениями. [ Note: Реализации обычно объявляют некоторые шаблоны функций как друзья basic_regex для достижения этой цели ] — end note
Функции, описанные в этом разделе, сообщают об ошибках, создавая исключения определенного типа regex_error.
namespace std { template <class charT, class traits = regex_traits<charT>> class basic_regex { public: // types: using value_type = charT; using traits_type = traits; using string_type = typename traits::string_type; using flag_type = regex_constants::syntax_option_type; using locale_type = typename traits::locale_type; // [re.regex.const], constants static constexpr regex_constants::syntax_option_type icase = regex_constants::icase; static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs; static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize; static constexpr regex_constants::syntax_option_type collate = regex_constants::collate; static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; static constexpr regex_constants::syntax_option_type basic = regex_constants::basic; static constexpr regex_constants::syntax_option_type extended = regex_constants::extended; static constexpr regex_constants::syntax_option_type awk = regex_constants::awk; static constexpr regex_constants::syntax_option_type grep = regex_constants::grep; static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep; static constexpr regex_constants::syntax_option_type multiline = regex_constants::multiline; // [re.regex.construct], construct/copy/destroy basic_regex(); explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript); basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript); basic_regex(const basic_regex&); basic_regex(basic_regex&&) noexcept; template <class ST, class SA> explicit basic_regex(const basic_string<charT, ST, SA>& p, flag_type f = regex_constants::ECMAScript); template <class ForwardIterator> basic_regex(ForwardIterator first, ForwardIterator last, flag_type f = regex_constants::ECMAScript); basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript); ~basic_regex(); basic_regex& operator=(const basic_regex&); basic_regex& operator=(basic_regex&&) noexcept; basic_regex& operator=(const charT* ptr); basic_regex& operator=(initializer_list<charT> il); template <class ST, class SA> basic_regex& operator=(const basic_string<charT, ST, SA>& p); // [re.regex.assign], assign basic_regex& assign(const basic_regex& that); basic_regex& assign(basic_regex&& that) noexcept; basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript); basic_regex& assign(const charT* p, size_t len, flag_type f); template <class string_traits, class A> basic_regex& assign(const basic_string<charT, string_traits, A>& s, flag_type f = regex_constants::ECMAScript); template <class InputIterator> basic_regex& assign(InputIterator first, InputIterator last, flag_type f = regex_constants::ECMAScript); basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript); // [re.regex.operations], const operations unsigned mark_count() const; flag_type flags() const; // [re.regex.locale], locale locale_type imbue(locale_type loc); locale_type getloc() const; // [re.regex.swap], swap void swap(basic_regex&); }; template<class ForwardIterator> basic_regex(ForwardIterator, ForwardIterator, regex_constants::syntax_option_type = regex_constants::ECMAScript) -> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; }
static constexpr regex_constants::syntax_option_type icase = regex_constants::icase; static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs; static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize; static constexpr regex_constants::syntax_option_type collate = regex_constants::collate; static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; static constexpr regex_constants::syntax_option_type basic = regex_constants::basic; static constexpr regex_constants::syntax_option_type extended = regex_constants::extended; static constexpr regex_constants::syntax_option_type awk = regex_constants::awk; static constexpr regex_constants::syntax_option_type grep = regex_constants::grep; static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep; static constexpr regex_constants::syntax_option_type multiline = regex_constants::multiline;
basic_regex();
Effects: Создает объект класса basic_regex , который не соответствует ни одной последовательности символов.
explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
Effects: Создает объект класса basic_regex; внутренний конечный автомат объекта создается из регулярного выражения, содержащегося в массиве charT длины char_traits<charT>::length(p) , первый элемент которого обозначается pи интерпретируется в соответствии с флагами f.
Postconditions: flags() возвращается f. mark_count() возвращает количество отмеченных подвыражений в выражении.
basic_regex(const charT* p, size_t len, flag_type f);
Effects: Создает объект класса basic_regex; внутренний конечный автомат объекта создается из регулярного выражения, содержащегося в последовательности символов [p, p+len), и интерпретируется в соответствии с флагами, указанными в f.
Postconditions: flags() возвращается f. mark_count() возвращает количество отмеченных подвыражений в выражении.
basic_regex(const basic_regex& e);
basic_regex(basic_regex&& e) noexcept;
Postconditions: flags() и mark_count() вернуть значения, которые e.flags() и e.mark_count(), соответственно, имели до построения. e находится в допустимом состоянии с неуказанным значением.
template <class ST, class SA>
explicit basic_regex(const basic_string<charT, ST, SA>& s,
flag_type f = regex_constants::ECMAScript);
Effects: Создает объект класса basic_regex; внутренний конечный автомат объекта создается из регулярного выражения, содержащегося в строке s, и интерпретируется в соответствии с флагами, указанными в f.
Postconditions: flags() возвращается f. mark_count() возвращает количество отмеченных подвыражений в выражении.
template <class ForwardIterator>
basic_regex(ForwardIterator first, ForwardIterator last,
flag_type f = regex_constants::ECMAScript);
Throws: regex_error если последовательность [first, last) не является допустимым регулярным выражением.
Effects: Создает объект класса basic_regex; внутренний конечный автомат объекта создается из регулярного выражения, содержащегося в последовательности символов [first, last), и интерпретируется в соответствии с флагами, указанными в f.
Postconditions: flags() возвращается f. mark_count() возвращает количество отмеченных подвыражений в выражении.
basic_regex(initializer_list<charT> il, flag_type f = regex_constants::ECMAScript);
basic_regex& operator=(const basic_regex& e);
basic_regex& operator=(basic_regex&& e) noexcept;
Postconditions: flags() и mark_count() вернуть значения, которые e.flags() и e.mark_count(), соответственно, имели до присвоения. e находится в допустимом состоянии с неуказанным значением.
basic_regex& operator=(const charT* ptr);
basic_regex& operator=(initializer_list<charT> il);
template <class ST, class SA>
basic_regex& operator=(const basic_string<charT, ST, SA>& p);
basic_regex& assign(const basic_regex& that);
basic_regex& assign(basic_regex&& that) noexcept;
basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
basic_regex& assign(const charT* ptr, size_t len, flag_type f = regex_constants::ECMAScript);
template <class string_traits, class A>
basic_regex& assign(const basic_string<charT, string_traits, A>& s,
flag_type f = regex_constants::ECMAScript);
Effects: Назначает регулярное выражение, содержащееся в строке s, интерпретируемое в соответствии с флагами, указанными в f. Если выбрасывается исключение, *this не изменяется.
Postconditions: Если исключение не возникло, flags() возвращает f и mark_count() возвращает количество отмеченных подвыражений в выражении.
template <class InputIterator>
basic_regex& assign(InputIterator first, InputIterator last,
flag_type f = regex_constants::ECMAScript);
Requires: Тип InputIterator должен удовлетворять требованиям Input Iterator.
basic_regex& assign(initializer_list<charT> il,
flag_type f = regex_constants::ECMAScript);
unsigned mark_count() const;
flag_type flags() const;
locale_type imbue(locale_type loc);
Effects: Возвращает результат, traits_inst.imbue(loc) где traits_inst находится (инициализированный по умолчанию) экземпляр аргумента типа шаблона, traits хранящийся в объекте. После вызова imbue на basic_regex объект не соответствует любой последовательности символов.
locale_type getloc() const;
void swap(basic_regex& e);
Postconditions: *this содержит регулярное выражение, которое было в e, e содержит регулярное выражение, которое было в *this.
template <class charT, class traits>
void swap(basic_regex<charT, traits>& lhs, basic_regex<charT, traits>& rhs);
Шаблон класса sub_match обозначает последовательность символов, совпадающих с конкретным отмеченным подвыражением.
namespace std { template <class BidirectionalIterator> class sub_match : public pair<BidirectionalIterator, BidirectionalIterator> { public: using value_type = typename iterator_traits<BidirectionalIterator>::value_type; using difference_type = typename iterator_traits<BidirectionalIterator>::difference_type; using iterator = BidirectionalIterator; using string_type = basic_string<value_type>; bool matched; constexpr sub_match(); difference_type length() const; operator string_type() const; string_type str() const; int compare(const sub_match& s) const; int compare(const string_type& s) const; int compare(const value_type* s) const; }; }
constexpr sub_match();
difference_type length() const;
operator string_type() const;
string_type str() const;
int compare(const sub_match& s) const;
int compare(const string_type& s) const;
int compare(const value_type* s) const;
template <class BiIter>
bool operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
template <class BiIter, class ST, class SA>
bool operator==(
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter, class ST, class SA>
bool operator!=(
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter, class ST, class SA>
bool operator<(
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter, class ST, class SA>
bool operator>(
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter, class ST, class SA>
bool operator>=(
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter, class ST, class SA>
bool operator<=(
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter, class ST, class SA>
bool operator==(
const sub_match<BiIter>& lhs,
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
template <class BiIter, class ST, class SA>
bool operator!=(
const sub_match<BiIter>& lhs,
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
template <class BiIter, class ST, class SA>
bool operator<(
const sub_match<BiIter>& lhs,
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
template <class BiIter, class ST, class SA>
bool operator>(
const sub_match<BiIter>& lhs,
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
template <class BiIter, class ST, class SA>
bool operator>=(
const sub_match<BiIter>& lhs,
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
template <class BiIter, class ST, class SA>
bool operator<=(
const sub_match<BiIter>& lhs,
const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
template <class BiIter>
bool operator==(const typename iterator_traits<BiIter>::value_type* lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator!=(const typename iterator_traits<BiIter>::value_type* lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator<(const typename iterator_traits<BiIter>::value_type* lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator>(const typename iterator_traits<BiIter>::value_type* lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator>=(const typename iterator_traits<BiIter>::value_type* lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator<=(const typename iterator_traits<BiIter>::value_type* lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator==(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs);
template <class BiIter>
bool operator!=(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs);
template <class BiIter>
bool operator<(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs);
template <class BiIter>
bool operator>(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs);
template <class BiIter>
bool operator>=(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs);
template <class BiIter>
bool operator<=(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type* rhs);
template <class BiIter>
bool operator==(const typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator!=(const typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator<(const typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator>(const typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator>=(const typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator<=(const typename iterator_traits<BiIter>::value_type& lhs,
const sub_match<BiIter>& rhs);
template <class BiIter>
bool operator==(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs);
template <class BiIter>
bool operator!=(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs);
template <class BiIter>
bool operator<(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs);
template <class BiIter>
bool operator>(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs);
template <class BiIter>
bool operator>=(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs);
template <class BiIter>
bool operator<=(const sub_match<BiIter>& lhs,
const typename iterator_traits<BiIter>::value_type& rhs);
template <class charT, class ST, class BiIter>
basic_ostream<charT, ST>&
operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
Шаблон класса match_results обозначает набор последовательностей символов, представляющих результат совпадения регулярного выражения. Хранилище для коллекции выделяется и освобождается по мере необходимости функциями-членами шаблона класса match_results.
Шаблон класса match_results удовлетворяет требованиям контейнера, поддерживающего распределитель, и контейнера последовательности ([container.requirements.general], [sequence.reqmts]), за исключением того, что поддерживаются только операции, определенные для контейнеров последовательностей, квалифицированных как const, и что семантика функций сравнения отличается от семантики, требуемой для контейнера.
Созданный по умолчанию match_results объект не имеет полностью установленного состояния результата. Результат совпадения - это ready когда, как следствие завершенного совпадения регулярного выражения, изменяющего такой объект, его состояние результата становится полностью установленным. Эффекты вызова большинства функций-членов из match_results неготового объекта не определены.
sub_match Объект , хранящийся в индексе 0 представляет подвыражение 0, т.е. весь матч. В этом случае sub_match член matched всегда true. sub_match Объект , хранящийся в индексе n означает , что совпавший отмеченные суб-выражение в n пределах согласованного выражения. Если подвыражение n участвовало в совпадении регулярного выражения, тогда sub_match член matched оценивает true, и элементы first и second обозначают диапазон символов, [first, second) которые сформировали это совпадение. В противном случае matched это false, и члены first и second точка в конце последовательности, обыскали. [ Note: Эти sub_match объекты , представляющие различные подвыражения , которые не участвовали в матче регулярного выражения не должны быть различны. ] — end note
namespace std { template <class BidirectionalIterator, class Allocator = allocator<sub_match<BidirectionalIterator>>> class match_results { public: using value_type = sub_match<BidirectionalIterator>; using const_reference = const value_type&; using reference = value_type&; using const_iterator = implementation-defined; using iterator = const_iterator; using difference_type = typename iterator_traits<BidirectionalIterator>::difference_type; using size_type = typename allocator_traits<Allocator>::size_type; using allocator_type = Allocator; using char_type = typename iterator_traits<BidirectionalIterator>::value_type; using string_type = basic_string<char_type>; // [re.results.const], construct/copy/destroy explicit match_results(const Allocator& a = Allocator()); match_results(const match_results& m); match_results(match_results&& m) noexcept; match_results& operator=(const match_results& m); match_results& operator=(match_results&& m); ~match_results(); // [re.results.state], state bool ready() const; // [re.results.size], size size_type size() const; size_type max_size() const; bool empty() const; // [re.results.acc], element access difference_type length(size_type sub = 0) const; difference_type position(size_type sub = 0) const; string_type str(size_type sub = 0) const; const_reference operator[](size_type n) const; const_reference prefix() const; const_reference suffix() const; const_iterator begin() const; const_iterator end() const; const_iterator cbegin() const; const_iterator cend() const; // [re.results.form], format template <class OutputIter> OutputIter format(OutputIter out, const char_type* fmt_first, const char_type* fmt_last, regex_constants::match_flag_type flags = regex_constants::format_default) const; template <class OutputIter, class ST, class SA> OutputIter format(OutputIter out, const basic_string<char_type, ST, SA>& fmt, regex_constants::match_flag_type flags = regex_constants::format_default) const; template <class ST, class SA> basic_string<char_type, ST, SA> format(const basic_string<char_type, ST, SA>& fmt, regex_constants::match_flag_type flags = regex_constants::format_default) const; string_type format(const char_type* fmt, regex_constants::match_flag_type flags = regex_constants::format_default) const; // [re.results.all], allocator allocator_type get_allocator() const; // [re.results.swap], swap void swap(match_results& that); }; }
Во всех match_results конструкторах копия Allocator аргумента должна использоваться для любого выделения памяти, выполняемого конструктором или функциями-членами в течение времени существования объекта.
match_results(const Allocator& a = Allocator());
match_results(const match_results& m);
match_results(match_results&& m) noexcept;
match_results& operator=(const match_results& m);
match_results& operator=(match_results&& m);
Элемент | Ценить |
ready() | m.ready() |
size() | m.size() |
str(n) | m.str(n) для всех целых чисел n < m.size() |
prefix() | m.prefix() |
suffix() | m.suffix() |
(*this)[n] | m[n] для всех целых чисел n < m.size() |
length(n) | m.length(n) для всех целых чисел n < m.size() |
position(n) | m.position(n) для всех целых чисел n < m.size() |
bool ready() const;
size_type size() const;
Returns: Один плюс количество отмеченных подвыражений в регулярном выражении, которое было сопоставлено, если *this представляет результат успешного сопоставления. В противном случае возвращается 0. [ Note: Состояние match_results объекта можно изменить, только передав этот объект в regex_match или regex_search. Разделы [re.alg.match] и [re.alg.search] укажите влияние этих алгоритмов на их match_results аргументы. ] — end note
size_type max_size() const;
bool empty() const;
difference_type length(size_type sub = 0) const;
difference_type position(size_type sub = 0) const;
string_type str(size_type sub = 0) const;
const_reference operator[](size_type n) const;
Returns: Ссылка на sub_match объект, представляющий последовательность символов, которая соответствует отмеченному подвыражению n. Если n == 0 затем возвращает ссылку на sub_match объект, представляющий последовательность символов, совпадающую со всем регулярным выражением. Если n >= size() затем возвращает sub_match объект, представляющий несогласованное подвыражение.
const_reference prefix() const;
Returns: Ссылка на sub_match объект, представляющий последовательность символов от начала строки, в которой выполняется поиск / поиск, до начала найденного совпадения.
const_reference suffix() const;
Returns: Ссылка на sub_match объект, представляющий последовательность символов от конца найденного совпадения до конца строки, в которой выполняется поиск.
const_iterator begin() const;
const_iterator cbegin() const;
const_iterator end() const;
const_iterator cend() const;
template <class OutputIter>
OutputIter format(
OutputIter out,
const char_type* fmt_first, const char_type* fmt_last,
regex_constants::match_flag_type flags = regex_constants::format_default) const;
Requires: ready() == true и OutputIter должен удовлетворять требованиям для Output Iterator.
Effects: Копирует последовательность символов [fmt_first, fmt_last) в OutputIter out. Заменяет каждый спецификатор формата или escape-последовательность в скопированном диапазоне либо символом (ами), который он представляет, либо последовательностью символов, *this к которой он относится. Битовые маски, указанные в, flags определяют, какие спецификаторы формата и управляющие последовательности распознаются.
template <class OutputIter, class ST, class SA>
OutputIter format(
OutputIter out,
const basic_string<char_type, ST, SA>& fmt,
regex_constants::match_flag_type flags = regex_constants::format_default) const;
template <class ST, class SA>
basic_string<char_type, ST, SA> format(
const basic_string<char_type, ST, SA>& fmt,
regex_constants::match_flag_type flags = regex_constants::format_default) const;
Effects: Создает пустую строку result типа basic_string<char_type, ST, SA> и вызывает:
format(back_inserter(result), fmt, flags);
string_type format(
const char_type* fmt,
regex_constants::match_flag_type flags = regex_constants::format_default) const;
Effects: Создает пустую строку result типа string_type и вызывает:
format(back_inserter(result), fmt, fmt + char_traits<char_type>::length(fmt), flags);
allocator_type get_allocator() const;
void swap(match_results& that);
Postconditions: *this содержит последовательность совпадающих подвыражений, которые были в that, that содержит последовательность совпадающих подвыражений, которые были в *this.
template <class BidirectionalIterator, class Allocator>
void swap(match_results<BidirectionalIterator, Allocator>& m1,
match_results<BidirectionalIterator, Allocator>& m2);
template <class BidirectionalIterator, class Allocator>
bool operator==(const match_results<BidirectionalIterator, Allocator>& m1,
const match_results<BidirectionalIterator, Allocator>& m2);
Returns: true если ни один из результатов матча не готов, false если готов один результат матча, а другой - нет. Если готовы оба результата совпадения, возвращается, true только если:
m1.empty() && m2.empty(), или
!m1.empty() && !m2.empty(), и выполняются следующие условия:
m1.prefix() == m2.prefix(),
m1.size() == m2.size() && equal(m1.begin(), m1.end(), m2.begin()), а также
m1.suffix() == m2.suffix().
[ Note: Алгоритм equal определен в п [algorithms]. ] — end note
template <class BidirectionalIterator, class Allocator>
bool operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
const match_results<BidirectionalIterator, Allocator>& m2);
template <class BidirectionalIterator, class Allocator, class charT, class traits>
bool regex_match(BidirectionalIterator first, BidirectionalIterator last,
match_results<BidirectionalIterator, Allocator>& m,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
Requires: Тип BidirectionalIterator должен удовлетворять требованиям а Bidirectional Iterator.
Effects: Определяет, есть ли совпадение между регулярным выражением eи всей последовательностью символов [first, last). Параметр flags используется для управления тем, как выражение сопоставляется с последовательностью символов. При определении совпадения учитываются только потенциальные совпадения, соответствующие всей последовательности символов. Возвращает, true если такое совпадение существует, в false противном случае. [ Example:
std::regex re("Get|GetValue"); std::cmatch m; regex_search("GetValue", m, re); // returns true, and m[0] contains "Get" regex_match ("GetValue", m, re); // returns true, and m[0] contains "GetValue" regex_search("GetValues", m, re); // returns true, and m[0] contains "Get" regex_match ("GetValues", m, re); // returns false
— end example ]
Элемент | Ценить |
m.size() | 1 + e.mark_count() |
m.empty() | false |
m.prefix().first | first |
m.prefix().second | first |
m.prefix().matched | false |
m.suffix().first | last |
m.suffix().second | last |
m.suffix().matched | false |
m[0].first | first |
m[0].second | last |
m[0].matched | true |
m[n].first | Для всех целых чисел 0 < n < m.size()- начало последовательности, соответствующей подвыражению n. В качестве альтернативы, если подвыражение n не участвовало в сопоставлении, тогда last. |
m[n].second | Для всех целых чисел 0 < n < m.size()- конец последовательности, соответствующей подвыражению n. В качестве альтернативы, если подвыражение n не участвовало в сопоставлении, тогда last. |
m[n].matched | Для всех целых чисел 0 < n < m.size(), true если n в совпадении участвовало подвыражение, в false противном случае. |
template <class BidirectionalIterator, class charT, class traits>
bool regex_match(BidirectionalIterator first, BidirectionalIterator last,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
Effects: Ведет себя «как будто», создавая экземпляр match_results<BidirectionalIterator> what, а затем возвращая результат regex_match(first, last, what, e, flags).
template <class charT, class Allocator, class traits>
bool regex_match(const charT* str,
match_results<const charT*, Allocator>& m,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class ST, class SA, class Allocator, class charT, class traits>
bool regex_match(const basic_string<charT, ST, SA>& s,
match_results<typename basic_string<charT, ST, SA>::const_iterator,
Allocator>& m,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class charT, class traits>
bool regex_match(const charT* str,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class ST, class SA, class charT, class traits>
bool regex_match(const basic_string<charT, ST, SA>& s,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class BidirectionalIterator, class Allocator, class charT, class traits>
bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
match_results<BidirectionalIterator, Allocator>& m,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
Requires: Тип BidirectionalIterator должен соответствовать требованиям а Bidirectional Iterator.
Effects: Определяет, есть ли внутри подпоследовательность, [first, last) которая соответствует регулярному выражению e. Параметр flags используется для управления тем, как выражение сопоставляется с последовательностью символов. Возвращает, true если такая последовательность существует, в false противном случае.
Элемент | Ценить |
m.size() | 1 + e.mark_count() |
m.empty() | false |
m.prefix().first | first |
m.prefix().second | m[0].first |
m.prefix().matched | m.prefix().first != m.prefix().second |
m.suffix().first | m[0].second |
m.suffix().second | last |
m.suffix().matched | m.suffix().first != m.suffix().second |
m[0].first | Начало последовательности символов, соответствующих регулярному выражению. |
m[0].second | Конец последовательности символов, соответствующей регулярному выражению. |
m[0].matched | true |
m[n].first | Для всех целых чисел 0 < n < m.size()- начало последовательности, соответствующей подвыражению n. В качестве альтернативы, если подвыражение n не участвовало в сопоставлении, тогда last. |
m[n].second | Для всех целых чисел 0 < n < m.size()- конец последовательности, соответствующей подвыражению n. В качестве альтернативы, если подвыражение n не участвовало в сопоставлении, тогда last . |
m[n].matched | Для всех целых чисел 0 < n < m.size(), true если n в совпадении участвовало подвыражение, в false противном случае. |
template <class charT, class Allocator, class traits>
bool regex_search(const charT* str, match_results<const charT*, Allocator>& m,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class ST, class SA, class Allocator, class charT, class traits>
bool regex_search(const basic_string<charT, ST, SA>& s,
match_results<typename basic_string<charT, ST, SA>::const_iterator,
Allocator>& m,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class BidirectionalIterator, class charT, class traits>
bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
Effects: Ведет себя «как будто», создавая объект what типа match_results<BidirectionalIterator> и возвращая его regex_search(first, last, what, e, flags).
template <class charT, class traits>
bool regex_search(const charT* str,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class ST, class SA, class charT, class traits>
bool regex_search(const basic_string<charT, ST, SA>& s,
const basic_regex<charT, traits>& e,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class OutputIterator, class BidirectionalIterator,
class traits, class charT, class ST, class SA>
OutputIterator
regex_replace(OutputIterator out,
BidirectionalIterator first, BidirectionalIterator last,
const basic_regex<charT, traits>& e,
const basic_string<charT, ST, SA>& fmt,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class OutputIterator, class BidirectionalIterator, class traits, class charT>
OutputIterator
regex_replace(OutputIterator out,
BidirectionalIterator first, BidirectionalIterator last,
const basic_regex<charT, traits>& e,
const charT* fmt,
regex_constants::match_flag_type flags = regex_constants::match_default);
Effects: Создает regex_iterator объект, i как если бы
regex_iterator<BidirectionalIterator, charT, traits> i(first, last, e, flags)
и используется i для перечисления всех совпадений m типа match_results<BidirectionalIterator> , встречающихся в последовательности [first, last). Если таких совпадений не найдено и !(flags & regex_constants::format_no_copy), то вызывает
out = copy(first, last, out)
Если какие-либо совпадения найдены, то для каждого такого совпадения:
Если !(flags & regex_constants::format_no_copy)звонит
out = copy(m.prefix().first, m.prefix().second, out)
Затем звонит
out = m.format(out, fmt, flags)
для первой формы функции и
out = m.format(out, fmt, fmt + char_traits<charT>::length(fmt), flags)
для второго.
Наконец, если такое совпадение найдено и !(flags & regex_constants::format_no_copy)вызывается
out = copy(last_m.suffix().first, last_m.suffix().second, out)
где last_m копия последнего найденного совпадения. Если flags & regex_constants::format_first_only не ноль, то заменяется только первое найденное совпадение.
template <class traits, class charT, class ST, class SA, class FST, class FSA>
basic_string<charT, ST, SA>
regex_replace(const basic_string<charT, ST, SA>& s,
const basic_regex<charT, traits>& e,
const basic_string<charT, FST, FSA>& fmt,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class traits, class charT, class ST, class SA>
basic_string<charT, ST, SA>
regex_replace(const basic_string<charT, ST, SA>& s,
const basic_regex<charT, traits>& e,
const charT* fmt,
regex_constants::match_flag_type flags = regex_constants::match_default);
Effects: Создает пустую строку result типа basic_string<charT, ST, SA> и вызывает:
regex_replace(back_inserter(result), s.begin(), s.end(), e, fmt, flags);
template <class traits, class charT, class ST, class SA>
basic_string<charT>
regex_replace(const charT* s,
const basic_regex<charT, traits>& e,
const basic_string<charT, ST, SA>& fmt,
regex_constants::match_flag_type flags = regex_constants::match_default);
template <class traits, class charT>
basic_string<charT>
regex_replace(const charT* s,
const basic_regex<charT, traits>& e,
const charT* fmt,
regex_constants::match_flag_type flags = regex_constants::match_default);
Effects: Создает пустую строку result типа basic_string<charT> и вызывает:
regex_replace(back_inserter(result), s, s + char_traits<charT>::length(s), e, fmt, flags);
Шаблон класса regex_iterator - это адаптер итератора. Он представляет новое представление существующей последовательности итератора, перечисляя все вхождения регулярного выражения в этой последовательности. A regex_iterator использует regex_search для поиска последовательных совпадений регулярных выражений в последовательности, из которой оно было построено. После того, как итератор построен и каждый раз operator++ используется, итератор находит и сохраняет значение match_results<BidirectionalIterator>. Если достигается конец последовательности (regex_search возвращается false), итератор становится равным значению итератора конца последовательности. Конструктор по умолчанию создает объект-итератор конца последовательности, который является единственным допустимым итератором, который можно использовать для конечного условия. Результат для operator* итератора конца последовательности не определен. Для любого другого значения итератораmatch_results<BidirectionalIterator>& возвращается константа . Результат для operator-> итератора конца последовательности не определен. Для любого другого итератора const match_results<BidirectionalIterator>* возвращается значение a . Нельзя хранить вещи в regex_iterators. Два итератора конца последовательности всегда равны. Итератор конца последовательности не равен итератору конца последовательности. Два итератора без конца последовательности равны, если они построены из одних и тех же аргументов.
namespace std { template <class BidirectionalIterator, class charT = typename iterator_traits<BidirectionalIterator>::value_type, class traits = regex_traits<charT>> class regex_iterator { public: using regex_type = basic_regex<charT, traits>; using iterator_category = forward_iterator_tag; using value_type = match_results<BidirectionalIterator>; using difference_type = ptrdiff_t; using pointer = const value_type*; using reference = const value_type&; regex_iterator(); regex_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, regex_constants::match_flag_type m = regex_constants::match_default); regex_iterator(BidirectionalIterator, BidirectionalIterator, const regex_type&&, regex_constants::match_flag_type = regex_constants::match_default) = delete; regex_iterator(const regex_iterator&); regex_iterator& operator=(const regex_iterator&); bool operator==(const regex_iterator&) const; bool operator!=(const regex_iterator&) const; const value_type& operator*() const; const value_type* operator->() const; regex_iterator& operator++(); regex_iterator operator++(int); private: BidirectionalIterator begin; // exposition only BidirectionalIterator end; // exposition only const regex_type* pregex; // exposition only regex_constants::match_flag_type flags; // exposition only match_results<BidirectionalIterator> match; // exposition only }; }
Объект типа, regex_iterator который не является итератором конца последовательности, содержит zero-length match if match[0].matched == true и
match[0].first == match[0].second. [ Note: Например, это может произойти , когда часть регулярного выражения , которые соответствовали состоит только из утверждения (например '^'
, '$'
,
'\b', '\B'). ] — end note
regex_iterator();
regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
regex_constants::match_flag_type m = regex_constants::match_default);
bool operator==(const regex_iterator& right) const;
bool operator!=(const regex_iterator& right) const;
const value_type& operator*() const;
const value_type* operator->() const;
regex_iterator& operator++();
Effects: Создает локальную переменную start типа BidirectionalIterator и инициализирует ее значением match[0].second.
Если итератор содержит совпадение нулевой длины, а start == end оператор устанавливает *this итератор конца последовательности и возвращается *this.
В противном случае, если итератор содержит совпадение нулевой длины, оператор вызывает:
regex_search(start, end, match, *pregex, flags | regex_constants::match_not_null | regex_constants::match_continuous)
Если вызов вернул, true оператор вернется *this. В противном случае оператор увеличивает start и продолжает работу, как если бы последнее совпадение не было совпадением нулевой длины.
Если самый последний матч не был матч нулевой длины, оператор устанавливает flags на flags | regex_constants::match_prev_avail и вызовы regex_search(start, end, match, *pregex, flags). Если вызов возвращает false набор итераторов в итератор *this конца последовательности. Затем итератор возвращается *this.
Во всех случаях, когда вызов regex_search возвращается true, match.prefix().first должно быть равно предыдущему значению match[0].second, и для каждого индекса i в полуоткрытом диапазоне, [0, match.size()) для которого match[i].matched есть true, match.position(i) должно возвращаться distance(begin, match[i].first).
[ Note: Это означает, что это match.position(i) дает смещение от начала целевой последовательности, которое часто не совпадает с смещением от последовательности, переданной в вызове regex_search. ] — end note
[ Note: Это означает, что компилятор может вызвать функцию поиска, зависящую от реализации, и в этом случае определенная пользователем специализация regex_search не будет вызываться. ] — end note
regex_iterator operator++(int);
Шаблон класса regex_token_iterator - это адаптер итератора; то есть он представляет новое представление существующей последовательности итератора, перечисляя все вхождения регулярного выражения в этой последовательности и представляя одно или несколько подвыражений для каждого найденного совпадения. Каждая позиция, перечисляемая итератором, является sub_match экземпляром шаблона класса, который представляет то, что соответствует определенному подвыражению в регулярном выражении.
Когда класс regex_token_iterator используется для перечисления одного подвыражения с индексом -1, итератор выполняет разделение полей: то есть перечисляет одно подвыражение для каждого раздела последовательности контейнера символов, которое не соответствует указанному регулярному выражению.
После создания итератор находит и сохраняет значение regex_iterator<BidirectionalIterator> position и устанавливает внутренний счетчик N на ноль. Он также поддерживает последовательность, subs которая содержит список подвыражений, которые будут перечислены. Каждый раз при operator++ использовании счетчик N увеличивается; если N больше или равно subs.size(), то итератор увеличивает член position и устанавливает значение count N в ноль.
Если достигается конец последовательности (position равен концу итератора последовательности), итератор становится равным значению итератора конца последовательности, если только перечисляемое подвыражение не имеет индекса -1, и в этом случае итератор перечисляет одно последнее подвыражение, которое содержит все символы от конца последнего совпадения регулярного выражения до конца перечисляемой входной последовательности, при условии, что это не будет пустым подвыражением.
Конструктор по умолчанию создает объект-итератор конца последовательности, который является единственным допустимым итератором, который можно использовать для конечного условия. Результат для operator* итератора конца последовательности не определен. Для любого другого итератораconst sub_match<BidirectionalIterator>& возвращается значение a . Результат для operator-> итератора конца последовательности не определен. Для любого другого итератора const sub_match<BidirectionalIterator>* возвращается значение a .
Нельзя хранить вещи в regex_token_iterators. Два итератора конца последовательности всегда равны. Итератор конца последовательности не равен итератору конца последовательности. Два итератора без конца последовательности равны, если они построены из одних и тех же аргументов.
namespace std { template <class BidirectionalIterator, class charT = typename iterator_traits<BidirectionalIterator>::value_type, class traits = regex_traits<charT>> class regex_token_iterator { public: using regex_type = basic_regex<charT, traits>; using iterator_category = forward_iterator_tag; using value_type = sub_match<BidirectionalIterator>; using difference_type = ptrdiff_t; using pointer = const value_type*; using reference = const value_type&; regex_token_iterator(); regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default); regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, const vector<int>& submatches, regex_constants::match_flag_type m = regex_constants::match_default); regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, initializer_list<int> submatches, regex_constants::match_flag_type m = regex_constants::match_default); template <size_t N> regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, const int (&submatches)[N], regex_constants::match_flag_type m = regex_constants::match_default); regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type&& re, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default) = delete; regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type&& re, const vector<int>& submatches, regex_constants::match_flag_type m = regex_constants::match_default) = delete; regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type&& re, initializer_list<int> submatches, regex_constants::match_flag_type m = regex_constants::match_default) = delete; template <size_t N> regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type&& re, const int (&submatches)[N], regex_constants::match_flag_type m = regex_constants::match_default) = delete; regex_token_iterator(const regex_token_iterator&); regex_token_iterator& operator=(const regex_token_iterator&); bool operator==(const regex_token_iterator&) const; bool operator!=(const regex_token_iterator&) const; const value_type& operator*() const; const value_type* operator->() const; regex_token_iterator& operator++(); regex_token_iterator operator++(int); private: using position_iterator = regex_iterator<BidirectionalIterator, charT, traits>; // exposition only position_iterator position; // exposition only const value_type* result; // exposition only value_type suffix; // exposition only size_t N; // exposition only vector<int> subs; // exposition only }; }
A suffix iterator - это regex_token_iterator объект, который указывает на последнюю последовательность символов в конце целевой последовательности. В качестве суффикса итератора элемента result содержит указатель к элементу данных suffix, значение элемента suffix.match является true, suffix.first указывает на начало конечной последовательности, а также suffix.second указывает на конец конечной последовательности.
[ Note: Для суффиксного итератора элемент данных suffix.first совпадает с концом последнего найденного совпадения и suffix.second совпадает с концом целевой последовательности ] — end note
current match Является , (*position).prefix() если subs[N] == -1, или (*position)[subs[N]] для любого другого значения subs[N].
regex_token_iterator();
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
int submatch = 0,
regex_constants::match_flag_type m = regex_constants::match_default);
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
const vector<int>& submatches,
regex_constants::match_flag_type m = regex_constants::match_default);
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
initializer_list<int> submatches,
regex_constants::match_flag_type m = regex_constants::match_default);
template <size_t N>
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
const int (&submatches)[N],
regex_constants::match_flag_type m = regex_constants::match_default);
Effects: Первый конструктор инициализирует член subs для хранения единственного значения submatch. Второй конструктор инициализирует член subs для хранения копии аргумента submatches. Третий и четвертый конструкторы инициализируют член subs для хранения копии последовательности целочисленных значений, на которые указывает диапазон итератора [submatches.begin(), submatches.end()) и [&submatches, &submatches + N), соответственно.
Затем каждый конструктор устанавливает N значение 0 и position значение position_iterator(a, b, re, m). Если position это не итератор конца последовательности, конструктор устанавливает result адрес текущего совпадения. В противном случае, если любое из значений, хранящихся в subs , равно -1, конструктор устанавливает *this итератор суффикса, который указывает на диапазон [a, b), в противном случае конструктор устанавливает *this итератор конца последовательности.
bool operator==(const regex_token_iterator& right) const;
Returns: true if *this и right оба являются итераторами конца последовательности, или if *this и right являются суффиксными итераторами и suffix == right.suffix; в противном случае возвращает, false если *this или right является итератором конца последовательности, или суффиксным итератором. В противном случае возвращается true если position == right.position, N == right.Nи subs == right.subs. В противном случае возвращается false.
bool operator!=(const regex_token_iterator& right) const;
const value_type& operator*() const;
const value_type* operator->() const;
regex_token_iterator& operator++();
Effects: Создает локальную переменную prev типа position_iterator, инициализированную значением position.
В противном случае, если N + 1 < subs.size(), увеличивается N и устанавливается result на адрес текущего совпадения.
В противном случае устанавливается N в 0 и увеличивается position. Если position это не итератор конца последовательности, оператор устанавливает result адрес текущего совпадения.
В противном случае, если какое-либо из значений, хранящихся в subs , равно -1, а prev->suffix().length() не 0, оператор устанавливает *this итератор суффикса, который указывает на диапазон [prev->suffix().first, prev->suffix().second).
regex_token_iterator& operator++(int);
Грамматика регулярных выражений, распознаваемаяbasic_regex объектами, созданными с помощью флага ECMAScript, указана в ECMA-262, за исключением случаев, указанных ниже.
Объекты со специализацией типа basic_regex store внутри себя представляют собой сконструированный по умолчанию экземпляр своего traits параметра шаблона, далее именуемый traits_inst. Этот traits_inst объект используется для поддержки локализации регулярного выражения; basic_regex функции-члены не должны вызывать каких-либо зависящих от локали C или C ++ API, включая функции ввода отформатированной строки. Вместо этого они должны вызывать соответствующую функцию-член черт для достижения требуемого эффекта.
Следующие конструкции в грамматике ECMAScript изменены следующим образом:
ClassAtom :: - ClassAtomNoDash ClassAtomExClass ClassAtomCollatingElement ClassAtomEquivalence IdentityEscape :: SourceCharacter but not c
Затем добавляются следующие новые постановки:
ClassAtomExClass :: [: ClassName :] ClassAtomCollatingElement :: [. ClassName .] ClassAtomEquivalence :: [= ClassName =] ClassName :: ClassNameCharacter ClassNameCharacter ClassName ClassNameCharacter :: SourceCharacter but not one of "." "=" ":"
Спектакли ClassAtomExClass, ClassAtomCollatingElement и ClassAtomEquivalence обеспечивают функциональность , эквивалентную той же функции в регулярных выражений в стандарте POSIX.
Грамматика регулярного выражения может быть изменена любыми regex_constants::syntax_option_type флагами, указанными при построении объекта со специализацией типа в basic_regex соответствии с правилами в Табл 130.
ClassName Производства, при использовании ClassAtomExClass, не действует , если traits_inst.lookup_classname возвращает ноль для этого имени. Имена , признанные действительными ClassNameс определяются типом класса черты, но , по крайней мере, следующие имена должны быть признаны: alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit, d, s, w. Кроме того, следующие выражения должны быть эквивалентными:
\d and [[:digit:]] \D and [^[:digit:]] \s and [[:space:]] \S and [^[:space:]] \w and [_[:alnum:]] \W and [^_[:alnum:]]
ClassName Производства при использовании в ClassAtomCollatingElement производстве не действует , если значение , возвращенное traits_inst.lookup_collatename для этого имени является пустой строкой.
Результаты нескольких вызовов to traits_inst.lookup_classname могут быть объединены поразрядным логическим оператором OR и впоследствии переданы в traits_inst.isctype.
ClassName Производства при использовании в ClassAtomEquivalence производстве не действует , если значение , возвращенное traits_inst.lookup_collatename для этого имени является пустой строкой или значение , возвращаемым traits_inst.transform_primary в результате вызова traits_inst.lookup_collatename является пустой строкой.
Когда последовательность символов, преобразуемая в конечный автомат, содержит недопустимое имя класса, транслятор должен сгенерировать объект исключения типа regex_error.
Если CV из a UnicodeEscapeSequence больше, чем наибольшее значение, которое может храниться в объекте типа, charT транслятор должен сгенерировать объект исключения типа regex_error. [ Note: Это означает, что значения формы, "uxxxx" которые не помещаются в символ, недействительны. ] — end note
Если грамматика регулярных выражений требует преобразования последовательности символов в целое значение, это достигается путем вызова traits_inst.value.
Поведение внутреннего представления конечного автомата при использовании для сопоставления последовательности символов описано в ECMA-262. Поведение изменяется в соответствии с любым match_flag_type flags заданным при использовании объекта регулярного выражения в одном из regular expression algorithms. Поведение также локализуется посредством взаимодействия с параметром шаблона класса признаков следующим образом:
Во время сопоставления конечного автомата регулярного выражения с последовательностью символов, два символа c и d сравниваются по следующим правилам:
если (flags() & regex_constants::icase) два символа равны if traits_inst.translate_nocase(c) == traits_inst.translate_nocase(d);
в противном случае, если flags() & regex_constants::collate два символа равны if traits_inst.translate(c) == traits_inst.translate(d);
в противном случае два символа равны, если c == d.
Во время сопоставления конечного автомата регулярных выражений с последовательностью символов сравнение диапазона элементов сопоставления c1-c2 с символом c выполняется следующим образом: если flags() & regex_constants::collate ложно, то символ c сопоставляется, если c1 <= c && c <= c2, в противном случае c сопоставляется в соответствии со следующим алгоритмом:
string_type str1 = string_type(1, flags() & icase ? traits_inst.translate_nocase(c1) : traits_inst.translate(c1); string_type str2 = string_type(1, flags() & icase ? traits_inst.translate_nocase(c2) : traits_inst.translate(c2); string_type str = string_type(1, flags() & icase ? traits_inst.translate_nocase(c) : traits_inst.translate(c); return traits_inst.transform(str1.begin(), str1.end()) <= traits_inst.transform(str.begin(), str.end()) && traits_inst.transform(str.begin(), str.end()) <= traits_inst.transform(str2.begin(), str2.end());
Во время сопоставления конечного автомата регулярных выражений с последовательностью символов проверка того, является ли элемент сопоставления членом первичного класса эквивалентности, выполняется сначала путем преобразования элемента сопоставления и класса эквивалентности в ключи сортировки с использованием traits::transform_primary, а затем сравнения сортировки ключи к равенству.
Во время сопоставления конечного автомата регулярного выражения с последовательностью символов символ c является членом класса символов, обозначенного диапазоном итератора, [first, last) если traits_inst.isctype(c, traits_inst.lookup_classname(first, last, flags() & icase)) есть true.