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 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 );
(2) (с 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 );
(3) (с 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 );
(4) (с 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 );
(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 и некоторым подпоследовательностью в целевой последовательности символов.

1) Анализирует общий диапазон [first, last). Результаты сопоставления возвращаются в m.
2) Анализирует строку с нулевым завершением, указанную по адресу str. Результаты сопоставления возвращаются в m.
3) Анализирует строку s. Результаты сопоставления возвращаются в m.
4-6) Эквивалентно (1-3), просто пропускает результаты сопоставления.
7) Перегрузка (3) запрещена для принятия временных строк, в противном случае эта функция заполняет match_results m итераторами строк, которые становятся недействительными немедленно.

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

Параметры

first, last - диапазон, определяющий целевую последовательность символов
str - указатель на целевую последовательность символов с нулевым завершением
s - строка, определяющая целевую последовательность символов
e - std::regex, который должен быть применён к целевой последовательности символов
m - результаты сопоставления
flags - std::regex_constants::match_flag_type, определяющие поведение поиска
Требования к типу
-BidirIt должно соответствовать требованиям LegacyBidirectionalIterator.
-Alloc должно соответствовать требованиям Allocator.

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

Возвращает 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 m[0].first
m.prefix().matched m.prefix().first != m.prefix().second
m.suffix().first m[0].second
m.suffix().second last
m.suffix().matched m.suffix().first != m.suffix().second
m[0].first начало последовательности совпадения
m[0].second конец последовательности совпадения
m[0].matched true
m[n].first начало последовательности, которая совпала с меткой подвыражения n, или last если подвыражение не участвовало в совпадении
m[n].second конец последовательности, которая совпала с меткой подвыражения n, или last если подвыражение не участвовало в совпадении
m[n].matched true если подвыражение n участвовало в совпадении, 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 2329 C++11 basic_string принимались rvalues, что, вероятно, приводило к висячим итераторам отклонено с помощью удалённой перегрузки

См. также

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

Spec-Zone.ru

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