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 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 );
(4) (с 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 );
(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 всему целевому последовательности символов, которая может быть указана как std::string, строка C-стиля или пара итераторов.

1) Определяет, существует ли соответствие между регулярным выражением e и всей целевой последовательностью символов [first, last), учитывая влияние flags. При определении соответствия рассматриваются только потенциальные совпадения, которые соответствуют всей последовательности символов. Результаты соответствия возвращаются в m.
2) Ведёт себя как (1) выше, опуская результаты соответствия.
3) Возвращает std::regex_match(str, str + std::char_traits<CharT>::length(str), m, e, flags).
4) Возвращает std::regex_match(s.begin(), s.end(), m, e, flags).
5) Возвращает std::regex_match(str, str + std::char_traits<CharT>::length(str), e, flags).
6) Возвращает std::regex_match(s.begin(), s.end(), e, flags).
7) Перегрузка (4) запрещена от принятия временных строк, в противном случае эта функция заполняет match_results m итераторами строк, которые становятся недействительными немедленно.

Обратите внимание, что regex_match будет успешно соответствовать регулярному выражению только всей последовательности символов, тогда как std::regex_search будет успешно соответствовать подпоследовательностям.

Параметры

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

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

Возвращает true если совпадение существует, false в противном случае. В любом случае объект m обновляется следующим образом:

Если совпадения нет:

m.ready() == true
m.empty() == true
m.size() == 0

Если совпадение существует:

m.ready() true
m.empty() false
m.size() количество помеченных подвыражений плюс 1, то есть 1 + e.mark_count()
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 начало последовательности, которая соответствовала помеченному подвыражению n, или last если подвыражение не участвовало в совпадении
m[n].second конец последовательности, которая соответствовала помеченному подвыражению n, или last если подвыражение не участвовало в совпадении
m[n].matched true если подвыражение n участвовало в совпадении, 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 2329 C++11 basic_string rvalues принимались, что могло привести к зависающим итераторам отклонено путём удалённой перегрузки

См. также

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/w/cpp/regex/regex_match

Spec-Zone.ru

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