std::regex_search(3)
π std::regex_search π
okay bestie, welcome to the std::regex_search(3) page from the C++ Standard Libary β section 3, the manual-page girlies. This is the function that asks: does my regex e match some subsequence somewhere in this target character sequence? Not the whole thing β that's a different function's job, and we will spill that tea below. π
πΈ NAME πΈ
std::regex_searchβstd::regex_search, bestie. That's the name. Iconic.
β¨ Synopsis β¨
Defined in header <regex>
(1) (since C++11)
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 );
(2) (since 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) (since 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 );
(4) (since 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 );
(5) (since 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 );
(6) (since 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 );
(7) (since 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;
So here's the whole point: this function determines if there is a match between the regular expression e and some subsequence in the target character sequence. Yes, some subsequence β she's flexible like that. π¦
- 1) Analyzes generic range
[first, last). Match results are returned inm. - 2) Analyzes a null-terminated string pointed to by
str. Match results are returned inm. - 3) Analyzes a string
s. Match results are returned inm. - 4-6) Equivalent to (1-3), just omits the match results.
- 7) The overload (3) is prohibited from accepting temporary strings, otherwise this function populates
match_results mwith string iterators that become invalid immediately.
regex_search will successfully match any subsequence of the given sequence, whereas std::regex_match will only return true if the regular expression matches the entire sequence. So if you're looking for a whole-string situation, wrong function, bestie. π
π«Ά Parameters π«Ά
first,lastβ a range identifying the target character sequence.strβ a pointer to a null-terminated target character sequence.sβ a string identifying target character sequence.eβ thestd::regexthat should be applied to the target character sequence.mβ the match results.flagsβstd::regex_constants::match_flag_typegoverning search behavior.
π Type requirements π
BidirItmust meet the requirements ofLegacyBidirectionalIterator.Allocmust meet the requirements ofAllocator.
π Return value π
Returns true if a match exists, false otherwise. In either case, the object m is updated, as follows:
If the match does not exist:
m.ready() == truem.empty() == truem.size() == 0
If the match exists:
m.ready()βtruem.empty()βfalsem.size()β number of marked subexpressions plus 1, that is,1 + e.mark_count()m.prefix().firstβfirstm.prefix().secondβm[0].firstm.prefix().matchedβm.prefix().first != m.prefix().secondm.suffix().firstβm[0].secondm.suffix().secondβlastm.suffix().matchedβm.suffix().first != m.suffix().secondm[0].firstβ the start of the matching sequencem[0].secondβ the end of the matching sequencem[0].matchedβtruem[n].firstβ the start of the sequence that matched marked subexpressionn, orlastif the subexpression did not participate in the matchm[n].secondβ the end of the sequence that matched marked subexpressionn, orlastif the subexpression did not participate in the matchm[n].matchedβtrueif sub-expressionnparticipated in the match,falseotherwise
π§ Notes π§
In order to examine all matches within the target sequence, std::regex_search may be called in a loop, restarting each time from m[0].second of the previous call. std::regex_iterator offers an easy interface to this iteration. So if you're about to write a whole loop yourself, bestie, maybe peek at std::regex_iterator first. π
π₯ Example π₯
// Run this code
#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';
}
π Output π
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
π§ Defect reports π§
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
- DR
LWG 2329β Applied to:C++11. Behavior as published:basic_stringrvalues were accepted, which was likely to result in dangling iterators. Correct behavior: rejected via a deleted overload.
π See also π
basic_regexβ regular expression object (C++11) (class template)match_resultsβ identifies one regular expression match, including all sub-expression matches (C++11) (class template)regex_matchβ attempts to match a regular expression to an entire character sequence (C++11) (function template)
Source/version: http://cppreference.com, dated 2024.06.10, page std::regex_search(3). That's the whole manual page, bestie β go match some subsequences and slay. πβ¨π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms