31 Regular expressions library [re]

31.1 General [re.general]

В этом разделе описаны компоненты, которые программы C ++ могут использовать для выполнения операций, связанных с сопоставлением и поиском регулярных выражений.

Следующие подпункты описывают базовый шаблон класса регулярного выражения и его характеристики, которые могут обрабатывать char-like аргументы шаблона, две специализации этого шаблона класса, которые обрабатывают последовательности char и wchar_­t, шаблон класса, который содержит результат совпадения регулярного выражения, серию алгоритмов, которые позволяют последовательность символов, с которой будет работать регулярное выражение, и два типа итераторов для перечисления совпадений регулярных выражений, как описано в Табл 128.

Таблица 128 - Сводка библиотеки регулярных выражений
Подпункт Заголовок (ы)
[re.def] Определения
[re.req] Требования
[re.const] Константы
[re.badexp] Тип исключения
[re.traits] Черты
[re.regex] Шаблон регулярного выражения <regex>
[re.submatch] Подматчи
[re.results] Результаты матчей
[re.alg] Алгоритмы
[re.iter] Итераторы
[re.grammar] Грамматика

31.2 Definitions [re.def]

К этому пункту применяются следующие определения:

31.2.1 collating element [defns.regex.collating.element]

последовательность из одного или нескольких символов в текущем языковом стандарте, которые сопоставляются, как если бы они были одним символом.

31.2.2 finite state machine [defns.regex.finite.state.machine]

неопределенная структура данных, которая используется для представления регулярного выражения и позволяет получать эффективные сопоставления с регулярным выражением.

31.2.3 format specifier [defns.regex.format.specifier]

последовательность из одного или нескольких символов, которая должна быть заменена некоторой частью совпадения регулярного выражения.

31.2.4 matched [defns.regex.matched]

последовательность из нуля или более символов соответствует регулярному выражению, когда символы в последовательности соответствуют последовательности символов, определенной шаблоном.

31.2.5 primary equivalence class [defns.regex.primary.equivalence.class]

набор из одного или нескольких символов, которые имеют один и тот же первичный ключ сортировки: это вес ключа сортировки, который зависит только от формы символа, а не от акцентов, регистра или языковых настроек.

31.2.6 regular expression [defns.regex.regular.expression]

шаблон, который выбирает определенные строки из набора символьных строк.

31.2.7 sub-expression [defns.regex.subexpression]

подмножество регулярного выражения, отмеченное круглыми скобками.

31.3 Requirements [re.req]

В этом подпункте определены требования к классам, представляющим признаки регулярных выражений. [ 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.

Таблица 129 - Требования к классам свойств регулярных выражений
ВыражениеТип возвратаУтверждение / примечание до / после условия
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

31.4 Header <regex> synopsis [re.syn]

#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>;
  }
}

31.5 Namespace std​::​regex_­constants [re.const]

Пространство имен std​::​regex_­constants содержит символические константы, используемые библиотекой регулярных выражений. Это пространство имен обеспечивает три типа, syntax_­option_­type, match_­flag_­type, и error_­type, вместе с несколькими константами этих типов.

31.5.1 Bitmask type syntax_­option_­type [re.synopt]

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.

Таблица 130 - syntax_­option_­type эффекты
ЭлементЭффект (ы), если установлен
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 выбран двигатель.

31.5.2 Bitmask type match_­flag_­type [re.matchflag]

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 для любого набора элементов битовой маски.

Таблица 131 - regex_­constants​::​match_­flag_­type эффекты при получении совпадения с последовательностью контейнера символов [first, last).
ЭлементЭффект (ы), если установлен
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 Если указано во время операции поиска и замены, заменяется только первое вхождение регулярного выражения.

31.5.3 Implementation-defined error_­type [re.err]

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:

Таблица 132 - error_­type значения в локали C
ЦенитьСостояние ошибки
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 Недостаточно памяти для определения соответствия регулярного выражения указанной последовательности символов.

31.6 Class regex_­error [re.badexp]

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);

Effects: Создает объект класса regex_­error.

Postconditions: ecode == code().

regex_constants::error_type code() const;

Returns: Код ошибки, переданный конструктору.

31.7 Class template regex_­traits [re.traits]

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);

Returns: char_­traits<charT>​::​length(p).

charT translate(charT c) const;

Returns: c.

charT translate_nocase(charT c) const;

Returns: use_­facet<ctype<charT>>(getloc()).tolower(c).

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().

Remarks: Ибо regex_­traits<char>, по крайней мере, 133 должны распознаваться узкие имена символов в Таблице . Поскольку regex_­traits<wchar_­t>, по крайней мере, 133 должны распознаваться имена широких символов в таблице .

bool isctype(charT c, char_class_type f) const;

Effects: Определяет, является ли персонаж c членом классификации символов, представленной f.

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;

Requires: Значение radix должно быть 8, 10 или 16.

Returns: значение, представленное цифрой ch в базе, radix если символ ch является действительной цифрой в базе radix; в противном случае возвращается -1.

locale_type imbue(locale_type loc);

Effects: Наполняет this копией локали loc. [ Note: Вызов imbue с локалью, отличной от используемой в настоящее время, делает недействительными все кэшированные данные, хранящиеся в *this. ] end note

Returns: если языковой стандарт ранее не был добавлен, то копия глобального языкового стандарта, действующего на момент создания *this, в противном случае - копия последнего переданного аргумента imbue.

Postconditions: getloc() == loc.

locale_type getloc() const;

Returns: если языковой стандарт не был добавлен, то копия глобального языкового стандарта, действующего на момент создания *this, в противном случае - копия последнего переданного аргумента imbue.

Таблица 133 - Имена классов символов и соответствующие ctype маски
Узкое имя персонажаИмя широкого символаСоответствующее 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:]].

31.8 Class template basic_­regex [re.regex]

Для символьного типа 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>;
}

31.8.1 basic_­regex constants [re.regex.const]

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;

Статические члены-константы предоставляются как синонимы констант, объявленных в пространстве имен regex_­constants.

31.8.2 basic_­regex constructors [re.regex.construct]

basic_regex();

Effects: Создает объект класса basic_­regex , который не соответствует ни одной последовательности символов.

explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);

Requires: p не должен быть нулевым указателем.

Throws: regex_­error если p не является допустимым регулярным выражением.

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);

Requires: p не должен быть нулевым указателем.

Throws: regex_­error если p не является допустимым регулярным выражением.

Effects: Создает объект класса basic_­regex; внутренний конечный автомат объекта создается из регулярного выражения, содержащегося в последовательности символов [p, p+len), и интерпретируется в соответствии с флагами, указанными в f.

Postconditions: flags() возвращается f. mark_­count() возвращает количество отмеченных подвыражений в выражении.

basic_regex(const basic_regex& e);

Effects: Создает объект класса basic_­regex как копию объекта e.

Postconditions: flags() и mark_­count() возврат e.flags() и e.mark_­count(), соответственно.

basic_regex(basic_regex&& e) noexcept;

Effects: Move создает объект класса basic_­regex из e.

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);

Throws: regex_­error если s не является допустимым регулярным выражением.

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);

Effects: То же, что и basic_­regex(il.begin(), il.end(), f).

31.8.3 basic_­regex assign [re.regex.assign]

basic_regex& operator=(const basic_regex& e);

Effects: Копии e в *this и возвращается *this.

Postconditions: flags() и mark_­count() возврат e.flags() и e.mark_­count(), соответственно.

basic_regex& operator=(basic_regex&& e) noexcept;

Effects: Переместить назначается из e в *this и возвращается *this.

Postconditions: flags() и mark_­count() вернуть значения, которые e.flags() и e.mark_­count(), соответственно, имели до присвоения. e находится в допустимом состоянии с неуказанным значением.

basic_regex& operator=(const charT* ptr);

Requires: ptr не должен быть нулевым указателем.

Effects: Возврат assign(ptr).

basic_regex& operator=(initializer_list<charT> il);

Effects: Возврат assign(il.begin(), il.end()).

template <class ST, class SA> basic_regex& operator=(const basic_string<charT, ST, SA>& p);

Effects: Возврат assign(p).

basic_regex& assign(const basic_regex& that);

Effects: Эквивалентно *this = that.

Returns: *this.

basic_regex& assign(basic_regex&& that) noexcept;

Effects: Эквивалентно *this = std​::​move(that).

Returns: *this.

basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);

Returns: assign(string_­type(ptr), f).

basic_regex& assign(const charT* ptr, size_t len, flag_type f = regex_constants::ECMAScript);

Returns: assign(string_­type(ptr, len), f).

template <class string_traits, class A> basic_regex& assign(const basic_string<charT, string_traits, A>& s, flag_type f = regex_constants::ECMAScript);

Throws: regex_­error если s не является допустимым регулярным выражением.

Returns: *this.

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.

Returns: assign(string_­type(first, last), f).

basic_regex& assign(initializer_list<charT> il, flag_type f = regex_constants::ECMAScript);

Effects: То же, что и assign(il.begin(), il.end(), f).

Returns: *this.

31.8.4 basic_­regex constant operations [re.regex.operations]

unsigned mark_count() const;

Effects: Возвращает количество отмеченных подвыражений в регулярном выражении.

flag_type flags() const;

Effects: Возвращает копию флагов синтаксиса регулярного выражения, которые были переданы конструктору объекта или последнему вызову assign.

31.8.5 basic_­regex locale [re.regex.locale]

locale_type imbue(locale_type loc);

Effects: Возвращает результат, traits_­inst.imbue(loc) где traits_­inst находится (инициализированный по умолчанию) экземпляр аргумента типа шаблона, traits хранящийся в объекте. После вызова imbue на basic_­regex объект не соответствует любой последовательности символов.

locale_type getloc() const;

Effects: Возвращает результат, в traits_­inst.getloc() котором traits_­inst находится (инициализированный по умолчанию) экземпляр параметра шаблона, traits хранящегося в объекте.

31.8.6 basic_­regex swap [re.regex.swap]

void swap(basic_regex& e);

Effects: Меняет местами содержимое двух регулярных выражений.

Postconditions: *this содержит регулярное выражение, которое было в e, e содержит регулярное выражение, которое было в *this.

Complexity: Постоянное время.

31.8.7 basic_­regex non-member functions [re.regex.nonmemb]

31.8.7.1 basic_­regex non-member swap [re.regex.nmswap]

template <class charT, class traits> void swap(basic_regex<charT, traits>& lhs, basic_regex<charT, traits>& rhs);

Effects: Звонки lhs.swap(rhs).

31.9 Class template sub_­match [re.submatch]

Шаблон класса 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;
    };
}

31.9.1 sub_­match members [re.submatch.members]

constexpr sub_match();

Effects: Значение инициализирует pair подобъект базового класса и член matched.

difference_type length() const;

Returns: matched ? distance(first, second) : 0.

operator string_type() const;

Returns: matched ? string_­type(first, second) : string_­type().

string_type str() const;

Returns: matched ? string_­type(first, second) : string_­type().

int compare(const sub_match& s) const;

Returns: str().compare(s.str()).

int compare(const string_type& s) const;

Returns: str().compare(s).

int compare(const value_type* s) const;

Returns: str().compare(s).

31.9.2 sub_­match non-member operators [re.submatch.op]

template <class BiIter> bool operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

Returns: lhs.compare(rhs) == 0.

template <class BiIter> bool operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

Returns: lhs.compare(rhs) != 0.

template <class BiIter> bool operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

Returns: lhs.compare(rhs) < 0.

template <class BiIter> bool operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

Returns: lhs.compare(rhs) <= 0.

template <class BiIter> bool operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

Returns: lhs.compare(rhs) >= 0.

template <class BiIter> bool operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

Returns: lhs.compare(rhs) > 0.

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);

Returns:

rhs.compare(typename sub_match<BiIter>::string_type(lhs.data(), lhs.size())) == 0

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);

Returns: !(lhs == 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);

Returns:

rhs.compare(typename sub_match<BiIter>::string_type(lhs.data(), lhs.size())) > 0

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);

Returns: rhs < lhs.

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);

Returns: !(lhs < 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);

Returns: !(rhs < lhs).

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);

Returns:

lhs.compare(typename sub_match<BiIter>::string_type(rhs.data(), rhs.size())) == 0

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);

Returns: !(lhs == 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);

Returns:

lhs.compare(typename sub_match<BiIter>::string_type(rhs.data(), rhs.size())) < 0

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);

Returns: rhs < lhs.

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);

Returns: !(lhs < 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);

Returns: !(rhs < lhs).

template <class BiIter> bool operator==(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs);

Returns: rhs.compare(lhs) == 0.

template <class BiIter> bool operator!=(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs);

Returns: !(lhs == rhs).

template <class BiIter> bool operator<(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs);

Returns: rhs.compare(lhs) > 0.

template <class BiIter> bool operator>(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs);

Returns: rhs < lhs.

template <class BiIter> bool operator>=(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs);

Returns: !(lhs < rhs).

template <class BiIter> bool operator<=(const typename iterator_traits<BiIter>::value_type* lhs, const sub_match<BiIter>& rhs);

Returns: !(rhs < lhs).

template <class BiIter> bool operator==(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs);

Returns: lhs.compare(rhs) == 0.

template <class BiIter> bool operator!=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs);

Returns: !(lhs == rhs).

template <class BiIter> bool operator<(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs);

Returns: lhs.compare(rhs) < 0.

template <class BiIter> bool operator>(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs);

Returns: rhs < lhs.

template <class BiIter> bool operator>=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs);

Returns: !(lhs < rhs).

template <class BiIter> bool operator<=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type* rhs);

Returns: !(rhs < lhs).

template <class BiIter> bool operator==(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs);

Returns: rhs.compare(typename sub_­match<BiIter>​::​string_­type(1, lhs)) == 0.

template <class BiIter> bool operator!=(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs);

Returns: !(lhs == rhs).

template <class BiIter> bool operator<(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs);

Returns: rhs.compare(typename sub_­match<BiIter>​::​string_­type(1, lhs)) > 0.

template <class BiIter> bool operator>(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs);

Returns: rhs < lhs.

template <class BiIter> bool operator>=(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs);

Returns: !(lhs < rhs).

template <class BiIter> bool operator<=(const typename iterator_traits<BiIter>::value_type& lhs, const sub_match<BiIter>& rhs);

Returns: !(rhs < lhs).

template <class BiIter> bool operator==(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs);

Returns: lhs.compare(typename sub_­match<BiIter>​::​string_­type(1, rhs)) == 0.

template <class BiIter> bool operator!=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs);

Returns: !(lhs == rhs).

template <class BiIter> bool operator<(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs);

Returns: lhs.compare(typename sub_­match<BiIter>​::​string_­type(1, rhs)) < 0.

template <class BiIter> bool operator>(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs);

Returns: rhs < lhs.

template <class BiIter> bool operator>=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs);

Returns: !(lhs < rhs).

template <class BiIter> bool operator<=(const sub_match<BiIter>& lhs, const typename iterator_traits<BiIter>::value_type& rhs);

Returns: !(rhs < lhs).

template <class charT, class ST, class BiIter> basic_ostream<charT, ST>& operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);

Returns: os << m.str().

31.10 Class template match_­results [re.results]

Шаблон класса 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);
    };
}

31.10.1 match_­results constructors [re.results.const]

Во всех match_­results конструкторах копия Allocator аргумента должна использоваться для любого выделения памяти, выполняемого конструктором или функциями-членами в течение времени существования объекта.

match_results(const Allocator& a = Allocator());

Effects: Создает объект класса match_­results.

Postconditions: ready() возвращается false. size() возвращается 0.

match_results(const match_results& m);

Effects: Создает объект класса match_­resultsкак копию m.

match_results(match_results&& m) noexcept;

Effects:  Перемещение создает объект класса match_­results из m удовлетворяющих тем же постусловий как табл 134. Кроме того, сохраненное Allocator значение строится из m.get_­allocator().

Throws: Ничего такого.

match_results& operator=(const match_results& m);

Effects: Назначает m в *this. Постусловия этой функции указаны в таблице 134.

match_results& operator=(match_results&& m);

Effects:  Move-правопреемников m в *this. Постусловия этой функции указаны в таблице 134.

Таблица 134 - match_­results эффекты оператора присваивания
ЭлементЦенить
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()

31.10.2 match_­results state [re.results.state]

bool ready() const;

Returns: true если *this имеет полностью установленное состояние результата, иначе false.

31.10.3 match_­results size [re.results.size]

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;

Returns: Максимальное количество sub_­match элементов, которые могут быть сохранены в *this.

bool empty() const;

Returns: size() == 0.

31.10.4 match_­results element access [re.results.acc]

difference_type length(size_type sub = 0) const;

Requires: ready() == true.

Returns: (*this)[sub].length().

difference_type position(size_type sub = 0) const;

Requires: ready() == true.

Returns: Расстояние от начала целевой последовательности до (*this)[sub].first.

string_type str(size_type sub = 0) const;

Requires: ready() == true.

Returns: string_­type((*this)[sub]).

const_reference operator[](size_type n) const;

Requires: ready() == true.

Returns: Ссылка на sub_­match объект, представляющий последовательность символов, которая соответствует отмеченному подвыражению n. Если n == 0 затем возвращает ссылку на sub_­match объект, представляющий последовательность символов, совпадающую со всем регулярным выражением. Если n >= size() затем возвращает sub_­match объект, представляющий несогласованное подвыражение.

const_reference prefix() const;

Requires: ready() == true.

Returns: Ссылка на sub_­match объект, представляющий последовательность символов от начала строки, в которой выполняется поиск / поиск, до начала найденного совпадения.

const_reference suffix() const;

Requires: ready() == true.

Returns: Ссылка на sub_­match объект, представляющий последовательность символов от конца найденного совпадения до конца строки, в которой выполняется поиск.

const_iterator begin() const; const_iterator cbegin() const;

Returns: Начальный итератор, который перечисляет все подвыражения, хранящиеся в *this.

const_iterator end() const; const_iterator cend() const;

Returns: Завершающий итератор, который перечисляет все подвыражения, хранящиеся в *this.

31.10.5 match_­results formatting [re.results.form]

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 определяют, какие спецификаторы формата и управляющие последовательности распознаются.

Returns: out.

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;

Effects: Эквивалентен:

return format(out, fmt.data(), fmt.data() + fmt.size(), flags);

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;

Requires: ready() == true.

Effects: Создает пустую строку result типа basic_­string<char_­type, ST, SA> и вызывает:

format(back_inserter(result), fmt, flags);

Returns: result.

string_type format( const char_type* fmt, regex_constants::match_flag_type flags = regex_constants::format_default) const;

Requires: ready() == true.

Effects: Создает пустую строку result типа string_­type и вызывает:

format(back_inserter(result), fmt, fmt + char_traits<char_type>::length(fmt), flags);

Returns: result.

31.10.6 match_­results allocator [re.results.all]

allocator_type get_allocator() const;

Returns: Копия распределителя, переданная конструктору объекта, или, если этот распределитель был заменен, копия самой последней замены.

31.10.7 match_­results swap [re.results.swap]

void swap(match_results& that);

Effects: Меняет местами содержимое двух последовательностей.

Postconditions: *this содержит последовательность совпадающих подвыражений, которые были в that, that содержит последовательность совпадающих подвыражений, которые были в *this.

Complexity: Постоянное время.

template <class BidirectionalIterator, class Allocator> void swap(match_results<BidirectionalIterator, Allocator>& m1, match_results<BidirectionalIterator, Allocator>& m2);

Effects: Как будто мимо m1.swap(m2).

31.10.8 match_­results non-member functions [re.results.nonmember]

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);

Returns: !(m1 == m2).

31.11 Regular expression algorithms [re.alg]

31.11.1 Exceptions [re.except]

Алгоритмы, описанные в этом подпункте, могут вызывать исключение определенного типа regex_­error. Если выбрано такое исключение e , e.code() должен быть возвращен либо, regex_­constants​::​error_­complexity либо regex_­constants​::​error_­stack.

31.11.2 regex_­match [re.alg.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);

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]

Postconditions: m.ready() == true в любом случае. Если функция возвращает результат false, то влияние на параметр m не определено, за исключением того, что m.size() возвращается 0 и m.empty() возвращается true. В противном случае влияние на параметр m приведено в таблице 135.

Таблица 135 - Эффекты regex_­match алгоритма
ЭлементЦенить
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);

Returns: regex_­match(str, str + char_­traits<charT>​::​length(str), m, e, flags).

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);

Returns: regex_­match(s.begin(), s.end(), m, e, flags).

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);

Returns: regex_­match(str, str + char_­traits<charT>​::​length(str), e, flags)

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);

Returns: regex_­match(s.begin(), s.end(), e, flags).

31.11.3 regex_­search [re.alg.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);

Requires: Тип BidirectionalIterator должен соответствовать требованиям а Bidirectional Iterator.

Effects: Определяет, есть ли внутри подпоследовательность, [first, last) которая соответствует регулярному выражению e. Параметр flags используется для управления тем, как выражение сопоставляется с последовательностью символов. Возвращает, true если такая последовательность существует, в false противном случае.

Postconditions: m.ready() == true в любом случае. Если функция возвращает результат false, то влияние на параметр m не определено, за исключением того, что m.size() возвращается 0 и m.empty() возвращается true. В противном случае влияние на параметр m приведено в таблице 136.

Таблица 136 - Эффекты regex_­search алгоритма
ЭлементЦенить
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);

Returns: regex_­search(str, str + char_­traits<charT>​::​length(str), m, e, flags).

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);

Returns: regex_­search(s.begin(), s.end(), m, e, flags).

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);

Returns: regex_­search(str, str + char_­traits<charT>​::​length(str), e, flags).

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);

Returns: regex_­search(s.begin(), s.end(), e, flags).

31.11.4 regex_­replace [re.alg.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);

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 не ноль, то заменяется только первое найденное совпадение.

Returns: out.

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);

Returns: result.

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);

Returns: result.

31.12 Regular expression iterators [re.iter]

31.12.1 Class template regex_­iterator [re.regiter]

Шаблон класса 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

31.12.1.1 regex_­iterator constructors [re.regiter.cnstr]

regex_iterator();

Effects: Создает итератор конца последовательности.

regex_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, regex_constants::match_flag_type m = regex_constants::match_default);

Effects: Инициализация begin и end к a и b, соответственно, наборы pregex к &re, наборы flags для m, а затем вызывает regex_­search(begin, end, match, *pregex, flags). Если этот вызов возвращает false конструктор, он устанавливает *this итератор конца последовательности.

31.12.1.2 regex_­iterator comparisons [re.regiter.comp]

bool operator==(const regex_iterator& right) const;

Returns: true если *this и right являются итераторами конца последовательности, или если выполняются все следующие условия:

  • begin == right.begin,

  • end == right.end,

  • pregex == right.pregex,

  • flags == right.flags, а также

  • match[0] == right.match[0];

иначе false.

bool operator!=(const regex_iterator& right) const;

Returns: !(*this == right).

31.12.1.3 regex_­iterator indirection [re.regiter.deref]

const value_type& operator*() const;

Returns: match.

const value_type* operator->() const;

Returns: &match.

31.12.1.4 regex_­iterator increment [re.regiter.incr]

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);

Effects: Как будто по:

regex_iterator tmp = *this;
++(*this);
return tmp;

31.12.2 Class template regex_­token_­iterator [re.tokiter]

Шаблон класса 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].

31.12.2.1 regex_­token_­iterator constructors [re.tokiter.cnstr]

regex_token_iterator();

Effects: Создает итератор конца последовательности.

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);

Requires: Каждое из значений инициализации submatches должно быть >= -1.

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 итератор конца последовательности.

31.12.2.2 regex_­token_­iterator comparisons [re.tokiter.comp]

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;

Returns: !(*this == right).

31.12.2.3 regex_­token_­iterator indirection [re.tokiter.deref]

const value_type& operator*() const;

Returns: *result.

const value_type* operator->() const;

Returns: result.

31.12.2.4 regex_­token_­iterator increment [re.tokiter.incr]

regex_token_iterator& operator++();

Effects: Создает локальную переменную prev типа position_­iterator, инициализированную значением position.

Если *this - суффиксный итератор, устанавливает итератор *this конца последовательности.

В противном случае, если N + 1 < subs.size(), увеличивается N и устанавливается result на адрес текущего совпадения.

В противном случае устанавливается N в 0 и увеличивается position. Если position это не итератор конца последовательности, оператор устанавливает result адрес текущего совпадения.

В противном случае, если какое-либо из значений, хранящихся в subs , равно -1, а prev->suffix().length() не 0, оператор устанавливает *this итератор суффикса, который указывает на диапазон [prev->suffix().first, prev->suffix().second).

В противном случае устанавливается *this итератор конца последовательности.

Returns: *this

regex_token_iterator& operator++(int);

Effects: Создаёт копию tmp из *this, а затем вызывает ++(*this).

Returns: tmp.

31.13 Modified ECMAScript regular expression grammar [re.grammar]

Грамматика регулярных выражений, распознаваемая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.