Spec-Zone.ru › C++

std::regex_search

Определён в заголовке <regex>
template< class BidirIt, class Alloc, class CharT, class Traits >
bool regex_search( 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_search( 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_search( 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_search( 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_search
    ( 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_search( 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_search
    ( 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 не удовлетворяет требованиям двунаправленного итератора Legacy, поведение не определено.

(до 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[0].first
m.prefix().matched m.prefix().first != m.prefix().second
m.suffix().first m[0].second
m.suffix().second last std::char_traits<CharT>::length(str) + str s.end()
m.suffix().matched m.suffix().first != m.suffix().second
m[0].first начало последовательности, совпавшей с e
m[0].second конец последовательности, совпавшей с e
m[0].matched true
m[n].first
  • last, если помеченное подвыражение n не участвовало в сопоставлении
  • в противном случае начало последовательности, соответствующей подвыражению n
m[n].second
  • last, если помеченное подвыражение n не участвовало в сопоставлении
  • в противном случае конец последовательности, соответствующей подвыражению n
m[n].matched
  • false, если помеченное подвыражение n не участвовало в сопоставлении
  • true в противном случае

Параметры

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

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

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

Примечания

Чтобы проверить все совпадения в целевой последовательности, std::regex_search можно вызывать в цикле, каждый раз начиная поиск с m[0].second предыдущего вызова. std::regex_iterator предоставляет удобный интерфейс для такой итерации.

Пример

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

int main()
{
    std::string lines[] = {"Roses are #ff0000",
                           "violets are #0000ff",
                           "all of my base are belong to you"};
    
    std::regex color_regex("#([a-f0-9]{2})"
                            "([a-f0-9]{2})"
                            "([a-f0-9]{2})");
    
    // simple match
    for (const auto& line : lines)
        std::cout << line << ": " << std::boolalpha
                  << std::regex_search(line, color_regex) << '\n';
    std::cout << '\n';
    
    // show contents of marked subexpressions within each match
    std::smatch color_match;
    for (const auto& line : lines)
        if (std::regex_search(line, color_match, color_regex))
        {
            std::cout << "matches for '" << line << "'\n";
            std::cout << "Prefix: '" << color_match.prefix() << "'\n";
            for (std::size_t i = 0; i < color_match.size(); ++i) 
                std::cout << i << ": " << color_match[i] << '\n';
            std::cout << "Suffix: '" << color_match.suffix() << "\'\n\n";
        }
    
    // repeated search (see also std::regex_iterator)
    std::string log(R"(
        Speed:        366
        Mass:        35
        Speed:        378
        Mass:        32
        Speed:        400
        Mass:        30)");
    std::regex r(R"(Speed:\t\d*)");
    for (std::smatch sm; regex_search(log, sm, r);)
    {
        std::cout << sm.str() << '\n';
        log = sm.suffix();
    }
    
    // C-style string demo
    std::cmatch cm;
    if (std::regex_search("this is a test", cm, std::regex("test"))) 
        std::cout << "\nFound " << cm[0] << " at position "
                  << cm.prefix().length() << '\n';
}

Вывод:

Roses are #ff0000: true
violets are #0000ff: true
all of my base are belong to you: false

matches for 'Roses are #ff0000'
Prefix: 'Roses are '
0: #ff0000
1: ff
2: 00
3: 00
Suffix: ''

matches for 'violets are #0000ff'
Prefix: 'violets are '
0: #0000ff
1: 00
2: 00
3: ff
Suffix: ''

Speed:        366
Speed:        378
Speed:        400

Found test at position 10

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

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

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

См. также

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

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

Spec-Zone.ru

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