31 Regular expressions library [re]

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