31namespace std _GLIBCXX_VISIBILITY(default)
33_GLIBCXX_BEGIN_NAMESPACE_VERSION
45 template<
typename _BiIter,
typename _Alloc,
46 typename _CharT,
typename _TraitsT>
48 __regex_algo_impl(_BiIter __s,
50 match_results<_BiIter, _Alloc>& __m,
51 const basic_regex<_CharT, _TraitsT>& __re,
53 _RegexExecutorPolicy __policy,
56 if (__re._M_automaton ==
nullptr)
59 typename match_results<_BiIter, _Alloc>::_Unchecked& __res = __m;
61 __m._M_resize(__re._M_automaton->_M_sub_count());
64 bool __use_dfs =
true;
66 || (__policy == _RegexExecutorPolicy::_S_alternate
67 && !__re._M_automaton->_M_has_backref))
71 __executor(__s, __e, __res, __re, __flags, __use_dfs);
73 __ret = __executor._M_match();
75 __ret = __executor._M_search();
79 for (
auto& __it : __res)
81 __it.first = __it.second = __e;
82 auto& __pre = __m._M_prefix();
83 auto& __suf = __m._M_suffix();
86 __pre.matched =
false;
89 __suf.matched =
false;
96 __pre.second = __res[0].first;
97 __pre.matched = (__pre.first != __pre.second);
98 __suf.first = __res[0].second;
100 __suf.matched = (__suf.first != __suf.second);
105 __m._M_establish_failed_match(__e);
112 template<
typename _Ch_type>
113 template<
typename _Fwd_iter>
114 typename regex_traits<_Ch_type>::string_type
121 static const char*
const __collatenames[] =
214 "left-square-bracket",
216 "right-square-bracket",
246 "left-curly-bracket",
248 "right-curly-bracket",
254 for (; __first != __last; ++__first)
255 __s += __fctyp.narrow(*__first, 0);
257 for (
const auto& __it : __collatenames)
259 return string_type(1, __fctyp.widen(
260 static_cast<char>(&__it - __collatenames)));
265 return string_type();
268 template<
typename _Ch_type>
269 template<
typename _Fwd_iter>
270 typename regex_traits<_Ch_type>::char_class_type
280 {
"d", ctype_base::digit},
281 {
"w", {ctype_base::alnum, _RegexMask::_S_under}},
282 {
"s", ctype_base::space},
283 {
"alnum", ctype_base::alnum},
284 {
"alpha", ctype_base::alpha},
285 {
"blank", ctype_base::blank},
286 {
"cntrl", ctype_base::cntrl},
287 {
"digit", ctype_base::digit},
288 {
"graph", ctype_base::graph},
289 {
"lower", ctype_base::lower},
290 {
"print", ctype_base::print},
291 {
"punct", ctype_base::punct},
292 {
"space", ctype_base::space},
293 {
"upper", ctype_base::upper},
294 {
"xdigit", ctype_base::xdigit},
298 for (; __first != __last; ++__first)
299 __s += __fctyp.narrow(__fctyp.tolower(*__first), 0);
301 for (
const auto& __it : __classnames)
302 if (__s == __it.first)
306 & (ctype_base::lower | ctype_base::upper)) != 0))
307 return ctype_base::alpha;
313 template<
typename _Ch_type>
316 isctype(_Ch_type __c, char_class_type __f)
const
321 return __fctyp.is(__f._M_base, __c)
323 || ((__f._M_extended & _RegexMask::_S_under)
324 && __c == __fctyp.widen(
'_'));
327#pragma GCC diagnostic push
328#pragma GCC diagnostic ignored "-Wc++17-extensions"
329 template<
typename _Ch_type>
332 value(_Ch_type __ch,
int __radix)
const
334 if constexpr (
sizeof(_Ch_type) > 1)
337 const char __c = __ctyp.narrow(__ch,
'\0');
342 const char __c =
static_cast<char>(__ch);
343 const char __max_digit = __radix == 8 ?
'7' :
'9';
344 if (
'0' <= __c && __c <= __max_digit)
373#pragma GCC diagnostic pop
375 template<
typename _Bi_iter,
typename _Alloc>
376 template<
typename _Out_iter>
380 const match_results<_Bi_iter, _Alloc>::char_type* __fmt_first,
381 const match_results<_Bi_iter, _Alloc>::char_type* __fmt_last,
382 match_flag_type __flags)
const
384 __glibcxx_assert( ready() );
390 auto __output = [&](
size_t __idx)
392 auto& __sub = (*this)[__idx];
394 __out = std::copy(__sub.first, __sub.second, __out);
399 bool __escaping =
false;
400 for (; __fmt_first != __fmt_last; __fmt_first++)
405 if (__fctyp.is(__ctype_type::digit, *__fmt_first))
406 __output(__traits.
value(*__fmt_first, 10));
408 *__out++ = *__fmt_first;
411 if (*__fmt_first ==
'\\')
416 if (*__fmt_first ==
'&')
421 *__out++ = *__fmt_first;
430 auto __next = std::find(__fmt_first, __fmt_last,
'$');
431 if (__next == __fmt_last)
434 __out = std::copy(__fmt_first, __next, __out);
436 auto __eat = [&](
char __ch) ->
bool
446 if (++__next == __fmt_last)
454 auto& __sub = _M_prefix();
456 __out = std::copy(__sub.first, __sub.second, __out);
458 else if (__eat(
'\''))
460 auto& __sub = _M_suffix();
462 __out = std::copy(__sub.first, __sub.second, __out);
464 else if (__fctyp.is(__ctype_type::digit, *__next))
466 long __num = __traits.
value(*__next, 10);
467 if (++__next != __fmt_last
468 && __fctyp.is(__ctype_type::digit, *__next))
471 __num += __traits.
value(*__next++, 10);
473 if (0 <= __num &&
size_t(__num) < this->
size())
478 __fmt_first = __next;
480 __out = std::copy(__fmt_first, __fmt_last, __out);
485 template<
typename _Out_iter,
typename _Bi_iter,
486 typename _Rx_traits,
typename _Ch_type>
488 __regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last,
490 const _Ch_type* __fmt,
size_t __len,
494 _IterT __i(__first, __last, __e, __flags);
499 __out = std::copy(__first, __last, __out);
504 for (; __i != __end; ++__i)
507 __out = std::copy(__i->prefix().first, __i->prefix().second,
509 __out = __i->format(__out, __fmt, __fmt + __len, __flags);
510 __last = __i->suffix();
515 __out = std::copy(__last.first, __last.second, __out);
520 template<
typename _Bi_iter,
527 if (_M_pregex ==
nullptr && __rhs._M_pregex ==
nullptr)
529 return _M_pregex == __rhs._M_pregex
530 && _M_begin == __rhs._M_begin
531 && _M_end == __rhs._M_end
532 && _M_flags == __rhs._M_flags
533 && _M_match[0] == __rhs._M_match[0];
536 template<
typename _Bi_iter,
549 if (_M_match[0].matched)
551 auto __start = _M_match[0].second;
552 auto __prefix_first = _M_match[0].second;
553 if (_M_match[0].first == _M_match[0].second)
555 if (__start == _M_end)
567 __glibcxx_assert(_M_match[0].matched);
568 auto& __prefix = _M_match._M_prefix();
569 __prefix.first = __prefix_first;
570 __prefix.matched = __prefix.first != __prefix.second;
572 _M_match._M_begin = _M_begin;
580 if (
regex_search(__start, _M_end, _M_match, *_M_pregex, _M_flags))
582 __glibcxx_assert(_M_match[0].matched);
583 auto& __prefix = _M_match._M_prefix();
584 __prefix.first = __prefix_first;
585 __prefix.matched = __prefix.first != __prefix.second;
587 _M_match._M_begin = _M_begin;
595 template<
typename _Bi_iter,
602 _M_position = __rhs._M_position;
603 _M_subs = __rhs._M_subs;
605 _M_suffix = __rhs._M_suffix;
606 _M_has_m1 = __rhs._M_has_m1;
607 _M_normalize_result();
611 template<
typename _Bi_iter,
618 if (_M_end_of_seq() && __rhs._M_end_of_seq())
620 if (_M_suffix.matched && __rhs._M_suffix.matched
621 && _M_suffix == __rhs._M_suffix)
623 if (_M_end_of_seq() || _M_suffix.matched
624 || __rhs._M_end_of_seq() || __rhs._M_suffix.matched)
626 return _M_position == __rhs._M_position
627 && _M_n == __rhs._M_n
628 && _M_subs == __rhs._M_subs;
631 template<
typename _Bi_iter,
638 _Position __prev = _M_position;
639 if (_M_suffix.matched)
641 else if (_M_n + 1 < _M_subs.size())
644 _M_result = &_M_current_match();
650 if (_M_position != _Position())
651 _M_result = &_M_current_match();
652 else if (_M_has_m1 && __prev->suffix().length() != 0)
654 _M_suffix.matched =
true;
655 _M_suffix.first = __prev->suffix().first;
656 _M_suffix.second = __prev->suffix().second;
657 _M_result = &_M_suffix;
665 template<
typename _Bi_iter,
670 _M_init(_Bi_iter __a, _Bi_iter __b)
673 for (
auto __it : _M_subs)
679 if (_M_position != _Position())
680 _M_result = &_M_current_match();
683 _M_suffix.matched =
true;
684 _M_suffix.first = __a;
685 _M_suffix.second = __b;
686 _M_result = &_M_suffix;
692_GLIBCXX_END_NAMESPACE_VERSION
const _Facet & use_facet(const locale &__loc)
Return a facet.
bool regex_search(_Bi_iter __s, _Bi_iter __e, match_results< _Bi_iter, _Alloc > &__m, const basic_regex< _Ch_type, _Rx_traits > &__re, regex_constants::match_flag_type __flags=regex_constants::match_default)
ISO C++ entities toplevel namespace is std.
constexpr auto size(const _Container &__cont) noexcept(noexcept(__cont.size())) -> decltype(__cont.size())
Return the size of a container.
Implementation details not part of the namespace std interface.
constexpr syntax_option_type __polynomial
constexpr match_flag_type format_first_only
constexpr match_flag_type match_continuous
match_flag_type
This is a bitmask type indicating regex matching rules.
constexpr match_flag_type match_prev_avail
constexpr match_flag_type format_sed
constexpr match_flag_type match_not_null
constexpr match_flag_type format_no_copy
Primary class template ctype facet.
_Out_iter format(_Out_iter __out, const char_type *__fmt_first, const char_type *__fmt_last, match_flag_type __flags=regex_constants::format_default) const
Takes a regex and an input string and does the matching.
Describes aspects of a regular expression.
regex_traits()
Constructs a default traits object.
int value(_Ch_type __ch, int __radix) const
Converts a digit to an int.
string_type lookup_collatename(_Fwd_iter __first, _Fwd_iter __last) const
Gets a collation element by name.
locale_type getloc() const
Gets a copy of the current locale in use by the regex_traits object.
bool isctype(_Ch_type __c, char_class_type __f) const
Determines if c is a member of an identified class.
char_class_type lookup_classname(_Fwd_iter __first, _Fwd_iter __last, bool __icase=false) const
Maps one or more characters to a named character classification.
regex_iterator()=default
Provides a singular iterator, useful for indicating one-past-the-end of a range.
bool operator==(const regex_iterator &) const noexcept
Tests the equivalence of two regex iterators.
regex_iterator & operator++()
Increments a regex_iterator.
bool operator==(const regex_token_iterator &__rhs) const
Compares a regex_token_iterator to another for equality.
regex_token_iterator & operator=(const regex_token_iterator &__rhs)
Assigns a regex_token_iterator to another.
regex_token_iterator & operator++()
Increments a regex_token_iterator.
regex_token_iterator()
Default constructs a regex_token_iterator.
Struct holding two objects of arbitrary type.