Spec-Zone.ru › C++

std::regex_match

Определено в заголовочном файле <regex>
template< class BidirIt, class Alloc, class CharT, class Traits >
bool regex_match( BidirIt first, BidirIt last,
                  std::match_results<BidirIt, Alloc>& m,
                  const std::basic_regex<CharT, Traits>& e,
                  std::regex_constants::match_flag_type flags =
                      std::regex_constants::match_default );
(1) (начиная с C++11)
template< class BidirIt, class CharT, class Traits >
bool regex_match( BidirIt first, BidirIt last,
                  const std::basic_regex<CharT, Traits>& e,
                  std::regex_constants::match_flag_type flags =
                      std::regex_constants::match_default );
(2) (начиная с C++11)
template< class CharT, class Alloc, class Traits >
bool regex_match( const CharT* str,
                  std::match_results<const CharT*, Alloc>& m,
                  const std::basic_regex<CharT, Traits>& e,
                  std::regex_constants::match_flag_type flags =
                      std::regex_constants::match_default );
(3) (начиная с C++11)
template< class CharT, class Traits >
bool regex_match( const CharT* str, const std::basic_regex<CharT, Traits>& e,
                  std::regex_constants::match_flag_type flags =
                      std::regex_constants::match_default );
(4) (начиная с C++11)
template< class STraits, class SAlloc, class Alloc,
          class CharT, class Traits >
bool regex_match
    ( const std::basic_string<CharT, STraits, SAlloc>& s,
      std::match_results
          <typename std::basic_string<CharT, STraits, SAlloc>::const_iterator,
           Alloc>& m,
      const std::basic_regex<CharT, Traits>& e,
      std::regex_constants::match_flag_type flags =
          std::regex_constants::match_default );
(5) (начиная с C++11)
template< class STraits, class SAlloc, class CharT, class Traits >
bool regex_match( const std::basic_string<CharT, STraits, SAlloc>& s,
                  const std::basic_regex<CharT, Traits>& e,
                  std::regex_constants::match_flag_type flags =
                      std::regex_constants::match_default );
(6) (начиная с C++11)
template< class STraits, class SAlloc, class Alloc,
          class CharT, class Traits >
bool regex_match
    ( const std::basic_string<CharT, STraits, SAlloc>&&,
      std::match_results
          <typename std::basic_string<CharT, STraits, SAlloc>::const_iterator,
           Alloc>&,
      const std::basic_regex<CharT, Traits>&,
      std::regex_constants::match_flag_type flags =
          std::regex_constants::match_default ) = delete;
(7) (начиная с C++11)

Определяет, соответствует ли регулярное выражение e всей целевой последовательности символов. Подробный результат сопоставления сохраняется в m (если он указан).

1,2) Целевая последовательность символов представлена диапазоном [first, last).

Если BidirIt не удовлетворяет требованиям LegacyBidirectionalIterator, поведение не определено.

(до C++23)

Если BidirIt не моделирует bidirectional_iterator, поведение не определено.

(начиная с C++23)
3,4) Целевая последовательность символов представлена диапазоном [str, str + std::char_traits<CharT>::length(str)).
5,6) Целевая последовательность символов представлена строкой s.
7) Целевую последовательность символов нельзя представить rvalue-значением std::string.

Если совпадение отсутствует, следующие выражения с участием m (если оно существует) должны давать указанные значения:

Выражение Значение
m.ready() true
m.size() 0
m.empty() true

Если совпадение существует, для любого целого числа в (​0, m.size()) в качестве n следующие выражения с участием m должны давать указанные значения для каждой перегрузки, перечисленной ниже:

Выражение Значение
Перегрузка (1) Перегрузка (3) Перегрузка (5)
m.ready() true
m.size() 1+e.mark_count()
m.empty() false
m.prefix().first first str s.begin()
m.prefix().second
m.prefix().matched false[1]
m.suffix().first last std::char_traits<CharT>::length(str) + str s.end()
m.suffix().second
m.suffix().matched false[2]
m[0].first first str s.begin()
m[0].second last std::char_traits<CharT>::length(str) + str s.end()
m[0].matched true[3]
m[n].first
  • last, если отмеченное подвыражение n не участвовало в совпадении
  • начало последовательности, соответствующей подвыражению n в противном случае
m[n].second
  • last, если отмеченное подвыражение n не участвовало в совпадении
  • конец последовательности, соответствующей подвыражению n в противном случае
m[n].matched
  • false, если отмеченное подвыражение n не участвовало в совпадении
  • true в противном случае
  1. Префикс совпадения пуст.
  2. Суффикс совпадения пуст.
  3. Совпадает вся последовательность.

Параметры

first, last - целевой диапазон символов
str - целевая C-строка с завершающим нулевым символом
s - целевая std::basic_string
m - результаты сопоставления
e - регулярное выражение
flags - флаги, определяющие способ выполнения сопоставления

Возвращаемое значение

Возвращает true, если вся целевая последовательность соответствует e, и false в противном случае.

Примечания

Поскольку regex_match учитывает только полные совпадения, одно и то же регулярное выражение может давать разные совпадения при использовании regex_match и std::regex_search:

std::regex re("Get|GetValue");
std::cmatch m;
std::regex_search("GetValue", m, re);  // returns true, and m[0] contains "Get"
std::regex_match ("GetValue", m, re);  // returns true, and m[0] contains "GetValue"
std::regex_search("GetValues", m, re); // returns true, and m[0] contains "Get"
std::regex_match ("GetValues", m, re); // returns false

Пример

#include <cstddef>
#include <iostream>
#include <regex>
#include <string>

int main()
{
    // Simple regular expression matching
    const std::string fnames[] = {"foo.txt", "bar.txt", "baz.dat", "zoidberg"};
    const std::regex txt_regex("[a-z]+\\.txt");
    
    for (const auto& fname : fnames)
        std::cout << fname << ": " << std::regex_match(fname, txt_regex) << '\n';
    
    // Extraction of a sub-match
    const std::regex base_regex("([a-z]+)\\.txt");
    std::smatch base_match;
    
    for (const auto& fname : fnames)
        if (std::regex_match(fname, base_match, base_regex))
            // The first sub_match is the whole string; the next
            // sub_match is the first parenthesized expression.
            if (base_match.size() == 2)
            {
                std::ssub_match base_sub_match = base_match[1];
                std::string base = base_sub_match.str();
                std::cout << fname << " has a base of " << base << '\n';
            }
    
    // Extraction of several sub-matches
    const std::regex pieces_regex("([a-z]+)\\.([a-z]+)");
    std::smatch pieces_match;
    
    for (const auto& fname : fnames)
        if (std::regex_match(fname, pieces_match, pieces_regex))
        {
            std::cout << fname << '\n';
            for (std::size_t i = 0; i < pieces_match.size(); ++i)
            {
                std::ssub_match sub_match = pieces_match[i];
                std::string piece = sub_match.str();
                std::cout << "  submatch " << i << ": " << piece << '\n';
            }
        }
}

Вывод:

foo.txt: 1
bar.txt: 1
baz.dat: 0
zoidberg: 0
foo.txt has a base of foo
bar.txt has a base of bar
foo.txt
  submatch 0: foo.txt
  submatch 1: foo
  submatch 2: txt
bar.txt
  submatch 0: bar.txt
  submatch 1: bar
  submatch 2: txt
baz.dat
  submatch 0: baz.dat
  submatch 1: baz
  submatch 2: dat

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Исправленное поведение
LWG 2205 C++11 n могло быть равно нулю в постусловии может быть только положительным
LWG 2273 C++11 не было ясно, учитываются ли частичные совпадения учитываются только полные совпадения
LWG 2329 C++11 перегрузка (5) принимала rvalue-значения basic_string,
что могло приводить к висячим итераторам
отклоняются с помощью удалённой перегрузки (7)

См. также

basic_regex
(C++11)
объект регулярного выражения
(шаблон класса)
match_results
(C++11)
определяет одно совпадение регулярного выражения, включая совпадения всех подвыражений
(шаблон класса)
regex_search
(C++11)
пытается сопоставить регулярное выражение с любой частью последовательности символов
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/regex/regex_match

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API