31 Regular expressions library [re]

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