31 namespace std _GLIBCXX_VISIBILITY(default)
35 _GLIBCXX_BEGIN_NAMESPACE_VERSION
43 template<
typename _BiIter,
typename _Alloc,
44 typename _CharT,
typename _TraitsT,
45 _RegexExecutorPolicy __policy,
48 __regex_algo_impl(_BiIter __s,
50 match_results<_BiIter, _Alloc>& __m,
51 const basic_regex<_CharT, _TraitsT>& __re,
54 if (__re._M_automaton ==
nullptr)
57 typename match_results<_BiIter, _Alloc>::_Base_type& __res = __m;
59 __m._M_resize(__re._M_automaton->_M_sub_count());
60 for (
auto& __it : __res)
65 || (__policy == _RegexExecutorPolicy::_S_alternate
66 && !__re._M_automaton->_M_has_backref))
68 _Executor<_BiIter, _Alloc, _TraitsT, false>
69 __executor(__s, __e, __m, __re, __flags);
71 __ret = __executor._M_match();
73 __ret = __executor._M_search();
77 _Executor<_BiIter, _Alloc, _TraitsT, true>
78 __executor(__s, __e, __m, __re, __flags);
80 __ret = __executor._M_match();
82 __ret = __executor._M_search();
86 for (
auto& __it : __res)
88 __it.first = __it.second = __e;
89 auto& __pre = __m._M_prefix();
90 auto& __suf = __m._M_suffix();
93 __pre.matched =
false;
96 __suf.matched =
false;
103 __pre.second = __res[0].first;
104 __pre.matched = (__pre.first != __pre.second);
105 __suf.first = __res[0].second;
107 __suf.matched = (__suf.first != __suf.second);
113 for (
auto& __it : __res)
115 __it.matched =
false;
116 __it.first = __it.second = __e;
122 _GLIBCXX_END_NAMESPACE_VERSION
125 _GLIBCXX_BEGIN_NAMESPACE_VERSION
127 template<
typename _Ch_type>
128 template<
typename _Fwd_iter>
129 typename regex_traits<_Ch_type>::string_type
134 const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
136 static const char* __collatenames[] =
229 "left-square-bracket",
231 "right-square-bracket",
261 "left-curly-bracket",
263 "right-curly-bracket",
269 for (; __first != __last; ++__first)
270 __s += __fctyp.narrow(*__first, 0);
272 for (
const auto& __it : __collatenames)
275 static_cast<char>(&__it - __collatenames)));
283 template<
typename _Ch_type>
284 template<
typename _Fwd_iter>
285 typename regex_traits<_Ch_type>::char_class_type
290 const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
295 {
"d", ctype_base::digit},
296 {
"w", {ctype_base::alnum, _RegexMask::_S_under}},
297 {
"s", ctype_base::space},
298 {
"alnum", ctype_base::alnum},
299 {
"alpha", ctype_base::alpha},
300 {
"blank", ctype_base::blank},
301 {
"cntrl", ctype_base::cntrl},
302 {
"digit", ctype_base::digit},
303 {
"graph", ctype_base::graph},
304 {
"lower", ctype_base::lower},
305 {
"print", ctype_base::print},
306 {
"punct", ctype_base::punct},
307 {
"space", ctype_base::space},
308 {
"upper", ctype_base::upper},
309 {
"xdigit", ctype_base::xdigit},
313 for (; __first != __last; ++__first)
314 __s += __fctyp.narrow(__fctyp.tolower(*__first), 0);
316 for (
const auto& __it : __classnames)
317 if (__s == __it.first)
321 & (ctype_base::lower | ctype_base::upper)) != 0))
322 return ctype_base::alpha;
328 template<
typename _Ch_type>
331 isctype(_Ch_type __c, char_class_type __f)
const 334 const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
336 return __fctyp.is(__f._M_base, __c)
338 || ((__f._M_extended & _RegexMask::_S_under)
339 && __c == __fctyp.widen(
'_'));
342 template<
typename _Ch_type>
345 value(_Ch_type __ch,
int __radix)
const 351 else if (__radix == 16)
354 return __is.
fail() ? -1 : __v;
357 template<
typename _Bi_iter,
typename _Alloc>
358 template<
typename _Out_iter>
361 const match_results<_Bi_iter, _Alloc>::char_type* __fmt_first,
362 const match_results<_Bi_iter, _Alloc>::char_type* __fmt_last,
365 __glibcxx_assert( ready() );
369 __fctyp(use_facet<__ctype_type>(__traits.
getloc()));
371 auto __output = [&](
size_t __idx)
373 auto& __sub = (*this)[__idx];
375 __out = std::copy(__sub.first, __sub.second, __out);
380 for (; __fmt_first != __fmt_last;)
381 if (*__fmt_first ==
'&')
386 else if (*__fmt_first ==
'\\')
388 if (++__fmt_first != __fmt_last
389 && __fctyp.is(__ctype_type::digit, *__fmt_first))
390 __output(__traits.
value(*__fmt_first++, 10));
395 *__out++ = *__fmt_first++;
401 auto __next = std::find(__fmt_first, __fmt_last,
'$');
402 if (__next == __fmt_last)
405 __out = std::copy(__fmt_first, __next, __out);
407 auto __eat = [&](
char __ch) ->
bool 417 if (++__next == __fmt_last)
425 auto& __sub = _M_prefix();
427 __out = std::copy(__sub.first, __sub.second, __out);
429 else if (__eat(
'\''))
431 auto& __sub = _M_suffix();
433 __out = std::copy(__sub.first, __sub.second, __out);
435 else if (__fctyp.is(__ctype_type::digit, *__next))
437 long __num = __traits.
value(*__next, 10);
438 if (++__next != __fmt_last
439 && __fctyp.is(__ctype_type::digit, *__next))
442 __num += __traits.
value(*__next++, 10);
444 if (0 <= __num && __num < this->size())
449 __fmt_first = __next;
451 __out = std::copy(__fmt_first, __fmt_last, __out);
456 template<
typename _Out_iter,
typename _Bi_iter,
457 typename _Rx_traits,
typename _Ch_type>
461 const _Ch_type* __fmt,
465 _IterT __i(__first, __last, __e, __flags);
470 __out = std::copy(__first, __last, __out);
476 for (; __i != __end; ++__i)
479 __out = std::copy(__i->prefix().first, __i->prefix().second,
481 __out = __i->format(__out, __fmt, __fmt + __len, __flags);
482 __last = __i->suffix();
487 __out = std::copy(__last.
first, __last.
second, __out);
492 template<
typename _Bi_iter,
499 return (_M_match.empty() && __rhs._M_match.
empty())
500 || (_M_begin == __rhs._M_begin
501 && _M_end == __rhs._M_end
502 && _M_pregex == __rhs._M_pregex
503 && _M_flags == __rhs._M_flags
504 && _M_match[0] == __rhs._M_match[0]);
507 template<
typename _Bi_iter,
520 if (_M_match[0].matched)
522 auto __start = _M_match[0].second;
523 auto __prefix_first = _M_match[0].second;
524 if (_M_match[0].first == _M_match[0].second)
526 if (__start == _M_end)
538 __glibcxx_assert(_M_match[0].matched);
539 auto& __prefix = _M_match._M_prefix();
540 __prefix.first = __prefix_first;
541 __prefix.matched = __prefix.first != __prefix.second;
543 _M_match._M_begin = _M_begin;
551 if (
regex_search(__start, _M_end, _M_match, *_M_pregex, _M_flags))
553 __glibcxx_assert(_M_match[0].matched);
554 auto& __prefix = _M_match._M_prefix();
555 __prefix.first = __prefix_first;
556 __prefix.matched = __prefix.first != __prefix.second;
558 _M_match._M_begin = _M_begin;
566 template<
typename _Bi_iter,
573 _M_position = __rhs._M_position;
574 _M_subs = __rhs._M_subs;
576 _M_suffix = __rhs._M_suffix;
577 _M_has_m1 = __rhs._M_has_m1;
578 _M_normalize_result();
582 template<
typename _Bi_iter,
589 if (_M_end_of_seq() && __rhs._M_end_of_seq())
591 if (_M_suffix.matched && __rhs._M_suffix.matched
592 && _M_suffix == __rhs._M_suffix)
594 if (_M_end_of_seq() || _M_suffix.matched
595 || __rhs._M_end_of_seq() || __rhs._M_suffix.matched)
597 return _M_position == __rhs._M_position
598 && _M_n == __rhs._M_n
599 && _M_subs == __rhs._M_subs;
602 template<
typename _Bi_iter,
609 _Position __prev = _M_position;
610 if (_M_suffix.matched)
612 else if (_M_n + 1 < _M_subs.size())
615 _M_result = &_M_current_match();
621 if (_M_position != _Position())
622 _M_result = &_M_current_match();
623 else if (_M_has_m1 && __prev->suffix().length() != 0)
625 _M_suffix.matched =
true;
626 _M_suffix.first = __prev->suffix().first;
627 _M_suffix.second = __prev->suffix().second;
628 _M_result = &_M_suffix;
636 template<
typename _Bi_iter,
641 _M_init(_Bi_iter __a, _Bi_iter __b)
644 for (
auto __it : _M_subs)
650 if (_M_position != _Position())
651 _M_result = &_M_current_match();
654 _M_suffix.matched =
true;
655 _M_suffix.first = __a;
656 _M_suffix.second = __b;
657 _M_result = &_M_suffix;
663 _GLIBCXX_END_NAMESPACE_VERSION
_T2 second
first is a copy of the first object
constexpr match_flag_type match_prev_avail
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.
int value(_Ch_type __ch, int __radix) const
Converts a digit to an int.
match_flag_type
This is a bitmask type indicating regex matching rules.
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)
_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
constexpr match_flag_type match_not_null
Managing sequences of characters and character-like objects.
regex_token_iterator & operator=(const regex_token_iterator &__rhs)
Assigns a regex_token_iterator to another.
constexpr match_flag_type format_no_copy
bool isctype(_Ch_type __c, char_class_type __f) const
Determines if c is a member of an identified class.
ios_base & hex(ios_base &__base)
Calls base.setf(ios_base::hex, ios_base::basefield).
ios_base & oct(ios_base &__base)
Calls base.setf(ios_base::oct, ios_base::basefield).
constexpr match_flag_type format_sed
_T1 first
second_type is the second bound type
string_type lookup_collatename(_Fwd_iter __first, _Fwd_iter __last) const
Gets a collation element by name.
constexpr syntax_option_type __polynomial
Primary class template ctype facet.This template class defines classification and conversion function...
bool fail() const
Fast error checking.
regex_token_iterator & operator++()
Increments a regex_token_iterator.
Controlling input for std::string.
_Out_iter regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last, const basic_regex< _Ch_type, _Rx_traits > &__e, const basic_string< _Ch_type, _St, _Sa > &__fmt, regex_constants::match_flag_type __flags=regex_constants::match_default)
Search for a regular expression within a range for multiple times, and replace the matched parts thro...
constexpr match_flag_type match_continuous
locale_type getloc() const
Gets a copy of the current locale in use by the regex_traits object.
regex_iterator & operator++()
Increments a regex_iterator.
Struct holding two objects of arbitrary type.
bool operator==(const regex_token_iterator &__rhs) const
Compares a regex_token_iterator to another for equality.
constexpr match_flag_type format_first_only
Basis for explicit traits specializations.
Describes aspects of a regular expression.
ISO C++ entities toplevel namespace is std.
bool empty() const
Indicates if the match_results contains no results.
bool operator==(const regex_iterator &__rhs) const
Tests the equivalence of two regex iterators.