31 Regular expressions library [re]

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) в OutputIterout. Заменяет каждый спецификатор формата или 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).