1 // class template regex -*- C++ -*- 2 3 // Copyright (C) 2010-2019 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /** 26 * @file bits/regex.h 27 * This is an internal header file, included by other library headers. 28 * Do not attempt to use it directly. @headername{regex} 29 */ 30 31 namespace std _GLIBCXX_VISIBILITY(default) 32 { 33 _GLIBCXX_BEGIN_NAMESPACE_VERSION 34 _GLIBCXX_BEGIN_NAMESPACE_CXX11 35 template<typename, typename> 36 class basic_regex; 37 38 template<typename, typename> 39 class match_results; 40 41 _GLIBCXX_END_NAMESPACE_CXX11 42 43 namespace __detail 44 { 45 enum class _RegexExecutorPolicy : int { _S_auto, _S_alternate }; 46 47 template<typename _BiIter, typename _Alloc, 48 typename _CharT, typename _TraitsT, 49 _RegexExecutorPolicy __policy, 50 bool __match_mode> 51 bool 52 __regex_algo_impl(_BiIter __s, 53 _BiIter __e, 54 match_results<_BiIter, _Alloc>& __m, 55 const basic_regex<_CharT, _TraitsT>& __re, 56 regex_constants::match_flag_type __flags); 57 58 template<typename, typename, typename, bool> 59 class _Executor; 60 } 61 62 _GLIBCXX_BEGIN_NAMESPACE_CXX11 63 64 /** 65 * @addtogroup regex 66 * @{ 67 */ 68 69 /** 70 * @brief Describes aspects of a regular expression. 71 * 72 * A regular expression traits class that satisfies the requirements of 73 * section [28.7]. 74 * 75 * The class %regex is parameterized around a set of related types and 76 * functions used to complete the definition of its semantics. This class 77 * satisfies the requirements of such a traits class. 78 */ 79 template<typename _Ch_type> 80 struct regex_traits 81 { 82 public: 83 typedef _Ch_type char_type; 84 typedef std::basic_string<char_type> string_type; 85 typedef std::locale locale_type; 86 private: 87 struct _RegexMask 88 { 89 typedef std::ctype_base::mask _BaseType; 90 _BaseType _M_base; 91 unsigned char _M_extended; 92 static constexpr unsigned char _S_under = 1 << 0; 93 static constexpr unsigned char _S_valid_mask = 0x1; 94 95 constexpr _RegexMask(_BaseType __base = 0, 96 unsigned char __extended = 0) 97 : _M_base(__base), _M_extended(__extended) 98 { } 99 100 constexpr _RegexMask 101 operator&(_RegexMask __other) const 102 { 103 return _RegexMask(_M_base & __other._M_base, 104 _M_extended & __other._M_extended); 105 } 106 107 constexpr _RegexMask 108 operator|(_RegexMask __other) const 109 { 110 return _RegexMask(_M_base | __other._M_base, 111 _M_extended | __other._M_extended); 112 } 113 114 constexpr _RegexMask 115 operator^(_RegexMask __other) const 116 { 117 return _RegexMask(_M_base ^ __other._M_base, 118 _M_extended ^ __other._M_extended); 119 } 120 121 constexpr _RegexMask 122 operator~() const 123 { return _RegexMask(~_M_base, ~_M_extended); } 124 125 _RegexMask& 126 operator&=(_RegexMask __other) 127 { return *this = (*this) & __other; } 128 129 _RegexMask& 130 operator|=(_RegexMask __other) 131 { return *this = (*this) | __other; } 132 133 _RegexMask& 134 operator^=(_RegexMask __other) 135 { return *this = (*this) ^ __other; } 136 137 constexpr bool 138 operator==(_RegexMask __other) const 139 { 140 return (_M_extended & _S_valid_mask) 141 == (__other._M_extended & _S_valid_mask) 142 && _M_base == __other._M_base; 143 } 144 145 constexpr bool 146 operator!=(_RegexMask __other) const 147 { return !((*this) == __other); } 148 149 }; 150 public: 151 typedef _RegexMask char_class_type; 152 153 public: 154 /** 155 * @brief Constructs a default traits object. 156 */ 157 regex_traits() { } 158 159 /** 160 * @brief Gives the length of a C-style string starting at @p __p. 161 * 162 * @param __p a pointer to the start of a character sequence. 163 * 164 * @returns the number of characters between @p *__p and the first 165 * default-initialized value of type @p char_type. In other words, uses 166 * the C-string algorithm for determining the length of a sequence of 167 * characters. 168 */ 169 static std::size_t 170 length(const char_type* __p) 171 { return string_type::traits_type::length(__p); } 172 173 /** 174 * @brief Performs the identity translation. 175 * 176 * @param __c A character to the locale-specific character set. 177 * 178 * @returns __c. 179 */ 180 char_type 181 translate(char_type __c) const 182 { return __c; } 183 184 /** 185 * @brief Translates a character into a case-insensitive equivalent. 186 * 187 * @param __c A character to the locale-specific character set. 188 * 189 * @returns the locale-specific lower-case equivalent of __c. 190 * @throws std::bad_cast if the imbued locale does not support the ctype 191 * facet. 192 */ 193 char_type 194 translate_nocase(char_type __c) const 195 { 196 typedef std::ctype<char_type> __ctype_type; 197 const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale)); 198 return __fctyp.tolower(__c); 199 } 200 201 /** 202 * @brief Gets a sort key for a character sequence. 203 * 204 * @param __first beginning of the character sequence. 205 * @param __last one-past-the-end of the character sequence. 206 * 207 * Returns a sort key for the character sequence designated by the 208 * iterator range [F1, F2) such that if the character sequence [G1, G2) 209 * sorts before the character sequence [H1, H2) then 210 * v.transform(G1, G2) < v.transform(H1, H2). 211 * 212 * What this really does is provide a more efficient way to compare a 213 * string to multiple other strings in locales with fancy collation 214 * rules and equivalence classes. 215 * 216 * @returns a locale-specific sort key equivalent to the input range. 217 * 218 * @throws std::bad_cast if the current locale does not have a collate 219 * facet. 220 */ 221 template<typename _Fwd_iter> 222 string_type 223 transform(_Fwd_iter __first, _Fwd_iter __last) const 224 { 225 typedef std::collate<char_type> __collate_type; 226 const __collate_type& __fclt(use_facet<__collate_type>(_M_locale)); 227 string_type __s(__first, __last); 228 return __fclt.transform(__s.data(), __s.data() + __s.size()); 229 } 230 231 /** 232 * @brief Gets a sort key for a character sequence, independent of case. 233 * 234 * @param __first beginning of the character sequence. 235 * @param __last one-past-the-end of the character sequence. 236 * 237 * Effects: if typeid(use_facet<collate<_Ch_type> >) == 238 * typeid(collate_byname<_Ch_type>) and the form of the sort key 239 * returned by collate_byname<_Ch_type>::transform(__first, __last) 240 * is known and can be converted into a primary sort key 241 * then returns that key, otherwise returns an empty string. 242 * 243 * @todo Implement this function correctly. 244 */ 245 template<typename _Fwd_iter> 246 string_type 247 transform_primary(_Fwd_iter __first, _Fwd_iter __last) const 248 { 249 // TODO : this is not entirely correct. 250 // This function requires extra support from the platform. 251 // 252 // Read http://gcc.gnu.org/ml/libstdc++/2013-09/msg00117.html and 253 // http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2003/n1429.htm 254 // for details. 255 typedef std::ctype<char_type> __ctype_type; 256 const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale)); 257 std::vector<char_type> __s(__first, __last); 258 __fctyp.tolower(__s.data(), __s.data() + __s.size()); 259 return this->transform(__s.data(), __s.data() + __s.size()); 260 } 261 262 /** 263 * @brief Gets a collation element by name. 264 * 265 * @param __first beginning of the collation element name. 266 * @param __last one-past-the-end of the collation element name. 267 * 268 * @returns a sequence of one or more characters that represents the 269 * collating element consisting of the character sequence designated by 270 * the iterator range [__first, __last). Returns an empty string if the 271 * character sequence is not a valid collating element. 272 */ 273 template<typename _Fwd_iter> 274 string_type 275 lookup_collatename(_Fwd_iter __first, _Fwd_iter __last) const; 276 277 /** 278 * @brief Maps one or more characters to a named character 279 * classification. 280 * 281 * @param __first beginning of the character sequence. 282 * @param __last one-past-the-end of the character sequence. 283 * @param __icase ignores the case of the classification name. 284 * 285 * @returns an unspecified value that represents the character 286 * classification named by the character sequence designated by 287 * the iterator range [__first, __last). If @p icase is true, 288 * the returned mask identifies the classification regardless of 289 * the case of the characters to be matched (for example, 290 * [[:lower:]] is the same as [[:alpha:]]), otherwise a 291 * case-dependent classification is returned. The value 292 * returned shall be independent of the case of the characters 293 * in the character sequence. If the name is not recognized then 294 * returns a value that compares equal to 0. 295 * 296 * At least the following names (or their wide-character equivalent) are 297 * supported. 298 * - d 299 * - w 300 * - s 301 * - alnum 302 * - alpha 303 * - blank 304 * - cntrl 305 * - digit 306 * - graph 307 * - lower 308 * - print 309 * - punct 310 * - space 311 * - upper 312 * - xdigit 313 */ 314 template<typename _Fwd_iter> 315 char_class_type 316 lookup_classname(_Fwd_iter __first, _Fwd_iter __last, 317 bool __icase = false) const; 318 319 /** 320 * @brief Determines if @p c is a member of an identified class. 321 * 322 * @param __c a character. 323 * @param __f a class type (as returned from lookup_classname). 324 * 325 * @returns true if the character @p __c is a member of the classification 326 * represented by @p __f, false otherwise. 327 * 328 * @throws std::bad_cast if the current locale does not have a ctype 329 * facet. 330 */ 331 bool 332 isctype(_Ch_type __c, char_class_type __f) const; 333 334 /** 335 * @brief Converts a digit to an int. 336 * 337 * @param __ch a character representing a digit. 338 * @param __radix the radix if the numeric conversion (limited to 8, 10, 339 * or 16). 340 * 341 * @returns the value represented by the digit __ch in base radix if the 342 * character __ch is a valid digit in base radix; otherwise returns -1. 343 */ 344 int 345 value(_Ch_type __ch, int __radix) const; 346 347 /** 348 * @brief Imbues the regex_traits object with a copy of a new locale. 349 * 350 * @param __loc A locale. 351 * 352 * @returns a copy of the previous locale in use by the regex_traits 353 * object. 354 * 355 * @note Calling imbue with a different locale than the one currently in 356 * use invalidates all cached data held by *this. 357 */ 358 locale_type 359 imbue(locale_type __loc) 360 { 361 std::swap(_M_locale, __loc); 362 return __loc; 363 } 364 365 /** 366 * @brief Gets a copy of the current locale in use by the regex_traits 367 * object. 368 */ 369 locale_type 370 getloc() const 371 { return _M_locale; } 372 373 protected: 374 locale_type _M_locale; 375 }; 376 377 // [7.8] Class basic_regex 378 /** 379 * Objects of specializations of this class represent regular expressions 380 * constructed from sequences of character type @p _Ch_type. 381 * 382 * Storage for the regular expression is allocated and deallocated as 383 * necessary by the member functions of this class. 384 */ 385 template<typename _Ch_type, typename _Rx_traits = regex_traits<_Ch_type>> 386 class basic_regex 387 { 388 public: 389 static_assert(is_same<_Ch_type, typename _Rx_traits::char_type>::value, 390 "regex traits class must have the same char_type"); 391 392 // types: 393 typedef _Ch_type value_type; 394 typedef _Rx_traits traits_type; 395 typedef typename traits_type::string_type string_type; 396 typedef regex_constants::syntax_option_type flag_type; 397 typedef typename traits_type::locale_type locale_type; 398 399 /** 400 * @name Constants 401 * std [28.8.1](1) 402 */ 403 //@{ 404 static constexpr flag_type icase = regex_constants::icase; 405 static constexpr flag_type nosubs = regex_constants::nosubs; 406 static constexpr flag_type optimize = regex_constants::optimize; 407 static constexpr flag_type collate = regex_constants::collate; 408 static constexpr flag_type ECMAScript = regex_constants::ECMAScript; 409 static constexpr flag_type basic = regex_constants::basic; 410 static constexpr flag_type extended = regex_constants::extended; 411 static constexpr flag_type awk = regex_constants::awk; 412 static constexpr flag_type grep = regex_constants::grep; 413 static constexpr flag_type egrep = regex_constants::egrep; 414 //@} 415 416 // [7.8.2] construct/copy/destroy 417 /** 418 * Constructs a basic regular expression that does not match any 419 * character sequence. 420 */ 421 basic_regex() 422 : _M_flags(ECMAScript), _M_loc(), _M_automaton(nullptr) 423 { } 424 425 /** 426 * @brief Constructs a basic regular expression from the 427 * sequence [__p, __p + char_traits<_Ch_type>::length(__p)) 428 * interpreted according to the flags in @p __f. 429 * 430 * @param __p A pointer to the start of a C-style null-terminated string 431 * containing a regular expression. 432 * @param __f Flags indicating the syntax rules and options. 433 * 434 * @throws regex_error if @p __p is not a valid regular expression. 435 */ 436 explicit 437 basic_regex(const _Ch_type* __p, flag_type __f = ECMAScript) 438 : basic_regex(__p, __p + char_traits<_Ch_type>::length(__p), __f) 439 { } 440 441 /** 442 * @brief Constructs a basic regular expression from the sequence 443 * [p, p + len) interpreted according to the flags in @p f. 444 * 445 * @param __p A pointer to the start of a string containing a regular 446 * expression. 447 * @param __len The length of the string containing the regular 448 * expression. 449 * @param __f Flags indicating the syntax rules and options. 450 * 451 * @throws regex_error if @p __p is not a valid regular expression. 452 */ 453 basic_regex(const _Ch_type* __p, std::size_t __len, 454 flag_type __f = ECMAScript) 455 : basic_regex(__p, __p + __len, __f) 456 { } 457 458 /** 459 * @brief Copy-constructs a basic regular expression. 460 * 461 * @param __rhs A @p regex object. 462 */ 463 basic_regex(const basic_regex& __rhs) = default; 464 465 /** 466 * @brief Move-constructs a basic regular expression. 467 * 468 * @param __rhs A @p regex object. 469 */ 470 basic_regex(basic_regex&& __rhs) noexcept = default; 471 472 /** 473 * @brief Constructs a basic regular expression from the string 474 * @p s interpreted according to the flags in @p f. 475 * 476 * @param __s A string containing a regular expression. 477 * @param __f Flags indicating the syntax rules and options. 478 * 479 * @throws regex_error if @p __s is not a valid regular expression. 480 */ 481 template<typename _Ch_traits, typename _Ch_alloc> 482 explicit 483 basic_regex(const std::basic_string<_Ch_type, _Ch_traits, 484 _Ch_alloc>& __s, 485 flag_type __f = ECMAScript) 486 : basic_regex(__s.data(), __s.data() + __s.size(), __f) 487 { } 488 489 /** 490 * @brief Constructs a basic regular expression from the range 491 * [first, last) interpreted according to the flags in @p f. 492 * 493 * @param __first The start of a range containing a valid regular 494 * expression. 495 * @param __last The end of a range containing a valid regular 496 * expression. 497 * @param __f The format flags of the regular expression. 498 * 499 * @throws regex_error if @p [__first, __last) is not a valid regular 500 * expression. 501 */ 502 template<typename _FwdIter> 503 basic_regex(_FwdIter __first, _FwdIter __last, 504 flag_type __f = ECMAScript) 505 : basic_regex(std::move(__first), std::move(__last), locale_type(), __f) 506 { } 507 508 /** 509 * @brief Constructs a basic regular expression from an initializer list. 510 * 511 * @param __l The initializer list. 512 * @param __f The format flags of the regular expression. 513 * 514 * @throws regex_error if @p __l is not a valid regular expression. 515 */ 516 basic_regex(initializer_list<_Ch_type> __l, flag_type __f = ECMAScript) 517 : basic_regex(__l.begin(), __l.end(), __f) 518 { } 519 520 /** 521 * @brief Destroys a basic regular expression. 522 */ 523 ~basic_regex() 524 { } 525 526 /** 527 * @brief Assigns one regular expression to another. 528 */ 529 basic_regex& 530 operator=(const basic_regex& __rhs) 531 { return this->assign(__rhs); } 532 533 /** 534 * @brief Move-assigns one regular expression to another. 535 */ 536 basic_regex& 537 operator=(basic_regex&& __rhs) noexcept 538 { return this->assign(std::move(__rhs)); } 539 540 /** 541 * @brief Replaces a regular expression with a new one constructed from 542 * a C-style null-terminated string. 543 * 544 * @param __p A pointer to the start of a null-terminated C-style string 545 * containing a regular expression. 546 */ 547 basic_regex& 548 operator=(const _Ch_type* __p) 549 { return this->assign(__p); } 550 551 /** 552 * @brief Replaces a regular expression with a new one constructed from 553 * an initializer list. 554 * 555 * @param __l The initializer list. 556 * 557 * @throws regex_error if @p __l is not a valid regular expression. 558 */ 559 basic_regex& 560 operator=(initializer_list<_Ch_type> __l) 561 { return this->assign(__l.begin(), __l.end()); } 562 563 /** 564 * @brief Replaces a regular expression with a new one constructed from 565 * a string. 566 * 567 * @param __s A pointer to a string containing a regular expression. 568 */ 569 template<typename _Ch_traits, typename _Alloc> 570 basic_regex& 571 operator=(const basic_string<_Ch_type, _Ch_traits, _Alloc>& __s) 572 { return this->assign(__s); } 573 574 // [7.8.3] assign 575 /** 576 * @brief the real assignment operator. 577 * 578 * @param __rhs Another regular expression object. 579 */ 580 basic_regex& 581 assign(const basic_regex& __rhs) 582 { 583 basic_regex __tmp(__rhs); 584 this->swap(__tmp); 585 return *this; 586 } 587 588 /** 589 * @brief The move-assignment operator. 590 * 591 * @param __rhs Another regular expression object. 592 */ 593 basic_regex& 594 assign(basic_regex&& __rhs) noexcept 595 { 596 basic_regex __tmp(std::move(__rhs)); 597 this->swap(__tmp); 598 return *this; 599 } 600 601 /** 602 * @brief Assigns a new regular expression to a regex object from a 603 * C-style null-terminated string containing a regular expression 604 * pattern. 605 * 606 * @param __p A pointer to a C-style null-terminated string containing 607 * a regular expression pattern. 608 * @param __flags Syntax option flags. 609 * 610 * @throws regex_error if __p does not contain a valid regular 611 * expression pattern interpreted according to @p __flags. If 612 * regex_error is thrown, *this remains unchanged. 613 */ 614 basic_regex& 615 assign(const _Ch_type* __p, flag_type __flags = ECMAScript) 616 { return this->assign(string_type(__p), __flags); } 617 618 /** 619 * @brief Assigns a new regular expression to a regex object from a 620 * C-style string containing a regular expression pattern. 621 * 622 * @param __p A pointer to a C-style string containing a 623 * regular expression pattern. 624 * @param __len The length of the regular expression pattern string. 625 * @param __flags Syntax option flags. 626 * 627 * @throws regex_error if p does not contain a valid regular 628 * expression pattern interpreted according to @p __flags. If 629 * regex_error is thrown, *this remains unchanged. 630 */ 631 basic_regex& 632 assign(const _Ch_type* __p, std::size_t __len, flag_type __flags) 633 { return this->assign(string_type(__p, __len), __flags); } 634 635 /** 636 * @brief Assigns a new regular expression to a regex object from a 637 * string containing a regular expression pattern. 638 * 639 * @param __s A string containing a regular expression pattern. 640 * @param __flags Syntax option flags. 641 * 642 * @throws regex_error if __s does not contain a valid regular 643 * expression pattern interpreted according to @p __flags. If 644 * regex_error is thrown, *this remains unchanged. 645 */ 646 template<typename _Ch_traits, typename _Alloc> 647 basic_regex& 648 assign(const basic_string<_Ch_type, _Ch_traits, _Alloc>& __s, 649 flag_type __flags = ECMAScript) 650 { 651 return this->assign(basic_regex(__s.data(), __s.data() + __s.size(), 652 _M_loc, __flags)); 653 } 654 655 /** 656 * @brief Assigns a new regular expression to a regex object. 657 * 658 * @param __first The start of a range containing a valid regular 659 * expression. 660 * @param __last The end of a range containing a valid regular 661 * expression. 662 * @param __flags Syntax option flags. 663 * 664 * @throws regex_error if p does not contain a valid regular 665 * expression pattern interpreted according to @p __flags. If 666 * regex_error is thrown, the object remains unchanged. 667 */ 668 template<typename _InputIterator> 669 basic_regex& 670 assign(_InputIterator __first, _InputIterator __last, 671 flag_type __flags = ECMAScript) 672 { return this->assign(string_type(__first, __last), __flags); } 673 674 /** 675 * @brief Assigns a new regular expression to a regex object. 676 * 677 * @param __l An initializer list representing a regular expression. 678 * @param __flags Syntax option flags. 679 * 680 * @throws regex_error if @p __l does not contain a valid 681 * regular expression pattern interpreted according to @p 682 * __flags. If regex_error is thrown, the object remains 683 * unchanged. 684 */ 685 basic_regex& 686 assign(initializer_list<_Ch_type> __l, flag_type __flags = ECMAScript) 687 { return this->assign(__l.begin(), __l.end(), __flags); } 688 689 // [7.8.4] const operations 690 /** 691 * @brief Gets the number of marked subexpressions within the regular 692 * expression. 693 */ 694 unsigned int 695 mark_count() const 696 { 697 if (_M_automaton) 698 return _M_automaton->_M_sub_count() - 1; 699 return 0; 700 } 701 702 /** 703 * @brief Gets the flags used to construct the regular expression 704 * or in the last call to assign(). 705 */ 706 flag_type 707 flags() const 708 { return _M_flags; } 709 710 // [7.8.5] locale 711 /** 712 * @brief Imbues the regular expression object with the given locale. 713 * 714 * @param __loc A locale. 715 */ 716 locale_type 717 imbue(locale_type __loc) 718 { 719 std::swap(__loc, _M_loc); 720 _M_automaton.reset(); 721 return __loc; 722 } 723 724 /** 725 * @brief Gets the locale currently imbued in the regular expression 726 * object. 727 */ 728 locale_type 729 getloc() const 730 { return _M_loc; } 731 732 // [7.8.6] swap 733 /** 734 * @brief Swaps the contents of two regular expression objects. 735 * 736 * @param __rhs Another regular expression object. 737 */ 738 void 739 swap(basic_regex& __rhs) 740 { 741 std::swap(_M_flags, __rhs._M_flags); 742 std::swap(_M_loc, __rhs._M_loc); 743 std::swap(_M_automaton, __rhs._M_automaton); 744 } 745 746 #ifdef _GLIBCXX_DEBUG 747 void 748 _M_dot(std::ostream& __ostr) 749 { _M_automaton->_M_dot(__ostr); } 750 #endif 751 752 private: 753 typedef std::shared_ptr<const __detail::_NFA<_Rx_traits>> _AutomatonPtr; 754 755 template<typename _FwdIter> 756 basic_regex(_FwdIter __first, _FwdIter __last, locale_type __loc, 757 flag_type __f) 758 : _M_flags(__f), _M_loc(std::move(__loc)), 759 _M_automaton(__detail::__compile_nfa<_Rx_traits>( 760 std::move(__first), std::move(__last), _M_loc, _M_flags)) 761 { } 762 763 template<typename _Bp, typename _Ap, typename _Cp, typename _Rp, 764 __detail::_RegexExecutorPolicy, bool> 765 friend bool 766 __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&, 767 const basic_regex<_Cp, _Rp>&, 768 regex_constants::match_flag_type); 769 770 template<typename, typename, typename, bool> 771 friend class __detail::_Executor; 772 773 flag_type _M_flags; 774 locale_type _M_loc; 775 _AutomatonPtr _M_automaton; 776 }; 777 778 #if __cplusplus < 201703L 779 template<typename _Ch, typename _Tr> 780 constexpr regex_constants::syntax_option_type 781 basic_regex<_Ch, _Tr>::icase; 782 783 template<typename _Ch, typename _Tr> 784 constexpr regex_constants::syntax_option_type 785 basic_regex<_Ch, _Tr>::nosubs; 786 787 template<typename _Ch, typename _Tr> 788 constexpr regex_constants::syntax_option_type 789 basic_regex<_Ch, _Tr>::optimize; 790 791 template<typename _Ch, typename _Tr> 792 constexpr regex_constants::syntax_option_type 793 basic_regex<_Ch, _Tr>::collate; 794 795 template<typename _Ch, typename _Tr> 796 constexpr regex_constants::syntax_option_type 797 basic_regex<_Ch, _Tr>::ECMAScript; 798 799 template<typename _Ch, typename _Tr> 800 constexpr regex_constants::syntax_option_type 801 basic_regex<_Ch, _Tr>::basic; 802 803 template<typename _Ch, typename _Tr> 804 constexpr regex_constants::syntax_option_type 805 basic_regex<_Ch, _Tr>::extended; 806 807 template<typename _Ch, typename _Tr> 808 constexpr regex_constants::syntax_option_type 809 basic_regex<_Ch, _Tr>::awk; 810 811 template<typename _Ch, typename _Tr> 812 constexpr regex_constants::syntax_option_type 813 basic_regex<_Ch, _Tr>::grep; 814 815 template<typename _Ch, typename _Tr> 816 constexpr regex_constants::syntax_option_type 817 basic_regex<_Ch, _Tr>::egrep; 818 #endif // ! C++17 819 820 #if __cpp_deduction_guides >= 201606 821 template<typename _ForwardIterator> 822 basic_regex(_ForwardIterator, _ForwardIterator, 823 regex_constants::syntax_option_type = {}) 824 -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>; 825 #endif 826 827 /** @brief Standard regular expressions. */ 828 typedef basic_regex<char> regex; 829 830 #ifdef _GLIBCXX_USE_WCHAR_T 831 /** @brief Standard wide-character regular expressions. */ 832 typedef basic_regex<wchar_t> wregex; 833 #endif 834 835 836 // [7.8.6] basic_regex swap 837 /** 838 * @brief Swaps the contents of two regular expression objects. 839 * @param __lhs First regular expression. 840 * @param __rhs Second regular expression. 841 */ 842 template<typename _Ch_type, typename _Rx_traits> 843 inline void 844 swap(basic_regex<_Ch_type, _Rx_traits>& __lhs, 845 basic_regex<_Ch_type, _Rx_traits>& __rhs) 846 { __lhs.swap(__rhs); } 847 848 849 // C++11 28.9 [re.submatch] Class template sub_match 850 /** 851 * A sequence of characters matched by a particular marked sub-expression. 852 * 853 * An object of this class is essentially a pair of iterators marking a 854 * matched subexpression within a regular expression pattern match. Such 855 * objects can be converted to and compared with std::basic_string objects 856 * of a similar base character type as the pattern matched by the regular 857 * expression. 858 * 859 * The iterators that make up the pair are the usual half-open interval 860 * referencing the actual original pattern matched. 861 */ 862 template<typename _BiIter> 863 class sub_match : public std::pair<_BiIter, _BiIter> 864 { 865 typedef iterator_traits<_BiIter> __iter_traits; 866 867 public: 868 typedef typename __iter_traits::value_type value_type; 869 typedef typename __iter_traits::difference_type difference_type; 870 typedef _BiIter iterator; 871 typedef basic_string<value_type> string_type; 872 873 bool matched; 874 875 constexpr sub_match() noexcept : matched() { } 876 877 /// Gets the length of the matching sequence. 878 difference_type 879 length() const noexcept 880 { return this->matched ? std::distance(this->first, this->second) : 0; } 881 882 /** 883 * @brief Gets the matching sequence as a string. 884 * 885 * @returns the matching sequence as a string. 886 * 887 * This is the implicit conversion operator. It is identical to the 888 * str() member function except that it will want to pop up in 889 * unexpected places and cause a great deal of confusion and cursing 890 * from the unwary. 891 */ 892 operator string_type() const 893 { return str(); } 894 895 /** 896 * @brief Gets the matching sequence as a string. 897 * 898 * @returns the matching sequence as a string. 899 */ 900 string_type 901 str() const 902 { 903 return this->matched 904 ? string_type(this->first, this->second) 905 : string_type(); 906 } 907 908 /** 909 * @brief Compares this and another matched sequence. 910 * 911 * @param __s Another matched sequence to compare to this one. 912 * 913 * @retval <0 this matched sequence will collate before @p __s. 914 * @retval =0 this matched sequence is equivalent to @p __s. 915 * @retval <0 this matched sequence will collate after @p __s. 916 */ 917 int 918 compare(const sub_match& __s) const 919 { return this->_M_str().compare(__s._M_str()); } 920 921 /** 922 * @{ 923 * @brief Compares this sub_match to a string. 924 * 925 * @param __s A string to compare to this sub_match. 926 * 927 * @retval <0 this matched sequence will collate before @p __s. 928 * @retval =0 this matched sequence is equivalent to @p __s. 929 * @retval <0 this matched sequence will collate after @p __s. 930 */ 931 int 932 compare(const string_type& __s) const 933 { return this->_M_str().compare(__s); } 934 935 int 936 compare(const value_type* __s) const 937 { return this->_M_str().compare(__s); } 938 // @} 939 940 // Non-standard, used by comparison operators 941 int 942 _M_compare(const value_type* __s, size_t __n) const 943 { return this->_M_str().compare({__s, __n}); } 944 945 private: 946 // Simplified basic_string_view for C++11 947 struct __string_view 948 { 949 using traits_type = typename string_type::traits_type; 950 951 __string_view() = default; 952 953 __string_view(const value_type* __s, size_t __n) noexcept 954 : _M_data(__s), _M_len(__n) { } 955 956 __string_view(const value_type* __s) noexcept 957 : _M_data(__s), _M_len(traits_type::length(__s)) { } 958 959 __string_view(const string_type& __s) noexcept 960 : _M_data(__s.data()), _M_len(__s.length()) { } 961 962 int 963 compare(__string_view __s) const noexcept 964 { 965 if (const size_t __n = std::min(_M_len, __s._M_len)) 966 if (int __ret = traits_type::compare(_M_data, __s._M_data, __n)) 967 return __ret; 968 const difference_type __diff = _M_len - __s._M_len; 969 if (__diff > std::numeric_limits<int>::max()) 970 return std::numeric_limits<int>::max(); 971 if (__diff < std::numeric_limits<int>::min()) 972 return std::numeric_limits<int>::min(); 973 return static_cast<int>(__diff); 974 } 975 976 private: 977 const value_type* _M_data = nullptr; 978 size_t _M_len = 0; 979 }; 980 981 // Create a __string_view over the iterator range. 982 template<typename _Iter = _BiIter> 983 __enable_if_t<__detail::__is_contiguous_iter<_Iter>::value, 984 __string_view> 985 _M_str() const noexcept 986 { 987 if (this->matched) 988 if (auto __len = this->second - this->first) 989 return { std::__addressof(*this->first), __len }; 990 return {}; 991 } 992 993 // Create a temporary string that can be converted to __string_view. 994 template<typename _Iter = _BiIter> 995 __enable_if_t<!__detail::__is_contiguous_iter<_Iter>::value, 996 string_type> 997 _M_str() const 998 { return str(); } 999 }; 1000 1001 1002 /** @brief Standard regex submatch over a C-style null-terminated string. */ 1003 typedef sub_match<const char*> csub_match; 1004 1005 /** @brief Standard regex submatch over a standard string. */ 1006 typedef sub_match<string::const_iterator> ssub_match; 1007 1008 #ifdef _GLIBCXX_USE_WCHAR_T 1009 /** @brief Regex submatch over a C-style null-terminated wide string. */ 1010 typedef sub_match<const wchar_t*> wcsub_match; 1011 1012 /** @brief Regex submatch over a standard wide string. */ 1013 typedef sub_match<wstring::const_iterator> wssub_match; 1014 #endif 1015 1016 // [7.9.2] sub_match non-member operators 1017 1018 /** 1019 * @brief Tests the equivalence of two regular expression submatches. 1020 * @param __lhs First regular expression submatch. 1021 * @param __rhs Second regular expression submatch. 1022 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1023 */ 1024 template<typename _BiIter> 1025 inline bool 1026 operator==(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 1027 { return __lhs.compare(__rhs) == 0; } 1028 1029 /** 1030 * @brief Tests the inequivalence of two regular expression submatches. 1031 * @param __lhs First regular expression submatch. 1032 * @param __rhs Second regular expression submatch. 1033 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1034 */ 1035 template<typename _BiIter> 1036 inline bool 1037 operator!=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 1038 { return __lhs.compare(__rhs) != 0; } 1039 1040 /** 1041 * @brief Tests the ordering of two regular expression submatches. 1042 * @param __lhs First regular expression submatch. 1043 * @param __rhs Second regular expression submatch. 1044 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1045 */ 1046 template<typename _BiIter> 1047 inline bool 1048 operator<(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 1049 { return __lhs.compare(__rhs) < 0; } 1050 1051 /** 1052 * @brief Tests the ordering of two regular expression submatches. 1053 * @param __lhs First regular expression submatch. 1054 * @param __rhs Second regular expression submatch. 1055 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1056 */ 1057 template<typename _BiIter> 1058 inline bool 1059 operator<=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 1060 { return __lhs.compare(__rhs) <= 0; } 1061 1062 /** 1063 * @brief Tests the ordering of two regular expression submatches. 1064 * @param __lhs First regular expression submatch. 1065 * @param __rhs Second regular expression submatch. 1066 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1067 */ 1068 template<typename _BiIter> 1069 inline bool 1070 operator>=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 1071 { return __lhs.compare(__rhs) >= 0; } 1072 1073 /** 1074 * @brief Tests the ordering of two regular expression submatches. 1075 * @param __lhs First regular expression submatch. 1076 * @param __rhs Second regular expression submatch. 1077 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1078 */ 1079 template<typename _BiIter> 1080 inline bool 1081 operator>(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 1082 { return __lhs.compare(__rhs) > 0; } 1083 1084 // Alias for a basic_string that can be compared to a sub_match. 1085 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1086 using __sub_match_string = basic_string< 1087 typename iterator_traits<_Bi_iter>::value_type, 1088 _Ch_traits, _Ch_alloc>; 1089 1090 /** 1091 * @brief Tests the equivalence of a string and a regular expression 1092 * submatch. 1093 * @param __lhs A string. 1094 * @param __rhs A regular expression submatch. 1095 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1096 */ 1097 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1098 inline bool 1099 operator==(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1100 const sub_match<_Bi_iter>& __rhs) 1101 { return __rhs._M_compare(__lhs.data(), __lhs.size()) == 0; } 1102 1103 /** 1104 * @brief Tests the inequivalence of a string and a regular expression 1105 * submatch. 1106 * @param __lhs A string. 1107 * @param __rhs A regular expression submatch. 1108 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1109 */ 1110 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1111 inline bool 1112 operator!=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1113 const sub_match<_Bi_iter>& __rhs) 1114 { return !(__lhs == __rhs); } 1115 1116 /** 1117 * @brief Tests the ordering of a string and a regular expression submatch. 1118 * @param __lhs A string. 1119 * @param __rhs A regular expression submatch. 1120 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1121 */ 1122 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1123 inline bool 1124 operator<(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1125 const sub_match<_Bi_iter>& __rhs) 1126 { return __rhs._M_compare(__lhs.data(), __lhs.size()) > 0; } 1127 1128 /** 1129 * @brief Tests the ordering of a string and a regular expression submatch. 1130 * @param __lhs A string. 1131 * @param __rhs A regular expression submatch. 1132 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1133 */ 1134 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1135 inline bool 1136 operator>(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1137 const sub_match<_Bi_iter>& __rhs) 1138 { return __rhs < __lhs; } 1139 1140 /** 1141 * @brief Tests the ordering of a string and a regular expression submatch. 1142 * @param __lhs A string. 1143 * @param __rhs A regular expression submatch. 1144 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1145 */ 1146 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1147 inline bool 1148 operator>=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1149 const sub_match<_Bi_iter>& __rhs) 1150 { return !(__lhs < __rhs); } 1151 1152 /** 1153 * @brief Tests the ordering of a string and a regular expression submatch. 1154 * @param __lhs A string. 1155 * @param __rhs A regular expression submatch. 1156 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1157 */ 1158 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1159 inline bool 1160 operator<=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1161 const sub_match<_Bi_iter>& __rhs) 1162 { return !(__rhs < __lhs); } 1163 1164 /** 1165 * @brief Tests the equivalence of a regular expression submatch and a 1166 * string. 1167 * @param __lhs A regular expression submatch. 1168 * @param __rhs A string. 1169 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1170 */ 1171 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1172 inline bool 1173 operator==(const sub_match<_Bi_iter>& __lhs, 1174 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1175 { return __lhs._M_compare(__rhs.data(), __rhs.size()) == 0; } 1176 1177 /** 1178 * @brief Tests the inequivalence of a regular expression submatch and a 1179 * string. 1180 * @param __lhs A regular expression submatch. 1181 * @param __rhs A string. 1182 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1183 */ 1184 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1185 inline bool 1186 operator!=(const sub_match<_Bi_iter>& __lhs, 1187 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1188 { return !(__lhs == __rhs); } 1189 1190 /** 1191 * @brief Tests the ordering of a regular expression submatch and a string. 1192 * @param __lhs A regular expression submatch. 1193 * @param __rhs A string. 1194 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1195 */ 1196 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1197 inline bool 1198 operator<(const sub_match<_Bi_iter>& __lhs, 1199 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1200 { return __lhs._M_compare(__rhs.data(), __rhs.size()) < 0; } 1201 1202 /** 1203 * @brief Tests the ordering of a regular expression submatch and a string. 1204 * @param __lhs A regular expression submatch. 1205 * @param __rhs A string. 1206 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1207 */ 1208 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1209 inline bool 1210 operator>(const sub_match<_Bi_iter>& __lhs, 1211 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1212 { return __rhs < __lhs; } 1213 1214 /** 1215 * @brief Tests the ordering of a regular expression submatch and a string. 1216 * @param __lhs A regular expression submatch. 1217 * @param __rhs A string. 1218 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1219 */ 1220 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1221 inline bool 1222 operator>=(const sub_match<_Bi_iter>& __lhs, 1223 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1224 { return !(__lhs < __rhs); } 1225 1226 /** 1227 * @brief Tests the ordering of a regular expression submatch and a string. 1228 * @param __lhs A regular expression submatch. 1229 * @param __rhs A string. 1230 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1231 */ 1232 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1233 inline bool 1234 operator<=(const sub_match<_Bi_iter>& __lhs, 1235 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1236 { return !(__rhs < __lhs); } 1237 1238 /** 1239 * @brief Tests the equivalence of a C string and a regular expression 1240 * submatch. 1241 * @param __lhs A null-terminated string. 1242 * @param __rhs A regular expression submatch. 1243 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1244 */ 1245 template<typename _Bi_iter> 1246 inline bool 1247 operator==(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1248 const sub_match<_Bi_iter>& __rhs) 1249 { return __rhs.compare(__lhs) == 0; } 1250 1251 /** 1252 * @brief Tests the inequivalence of a C string and a regular 1253 * expression submatch. 1254 * @param __lhs A null-terminated string. 1255 * @param __rhs A regular expression submatch. 1256 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1257 */ 1258 template<typename _Bi_iter> 1259 inline bool 1260 operator!=(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1261 const sub_match<_Bi_iter>& __rhs) 1262 { return !(__lhs == __rhs); } 1263 1264 /** 1265 * @brief Tests the ordering of a C string and a regular expression submatch. 1266 * @param __lhs A null-terminated string. 1267 * @param __rhs A regular expression submatch. 1268 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1269 */ 1270 template<typename _Bi_iter> 1271 inline bool 1272 operator<(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1273 const sub_match<_Bi_iter>& __rhs) 1274 { return __rhs.compare(__lhs) > 0; } 1275 1276 /** 1277 * @brief Tests the ordering of a C string and a regular expression submatch. 1278 * @param __lhs A null-terminated string. 1279 * @param __rhs A regular expression submatch. 1280 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1281 */ 1282 template<typename _Bi_iter> 1283 inline bool 1284 operator>(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1285 const sub_match<_Bi_iter>& __rhs) 1286 { return __rhs < __lhs; } 1287 1288 /** 1289 * @brief Tests the ordering of a C string and a regular expression submatch. 1290 * @param __lhs A null-terminated string. 1291 * @param __rhs A regular expression submatch. 1292 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1293 */ 1294 template<typename _Bi_iter> 1295 inline bool 1296 operator>=(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1297 const sub_match<_Bi_iter>& __rhs) 1298 { return !(__lhs < __rhs); } 1299 1300 /** 1301 * @brief Tests the ordering of a C string and a regular expression submatch. 1302 * @param __lhs A null-terminated string. 1303 * @param __rhs A regular expression submatch. 1304 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1305 */ 1306 template<typename _Bi_iter> 1307 inline bool 1308 operator<=(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1309 const sub_match<_Bi_iter>& __rhs) 1310 { return !(__rhs < __lhs); } 1311 1312 /** 1313 * @brief Tests the equivalence of a regular expression submatch and a C 1314 * string. 1315 * @param __lhs A regular expression submatch. 1316 * @param __rhs A null-terminated string. 1317 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1318 */ 1319 template<typename _Bi_iter> 1320 inline bool 1321 operator==(const sub_match<_Bi_iter>& __lhs, 1322 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1323 { return __lhs.compare(__rhs) == 0; } 1324 1325 /** 1326 * @brief Tests the inequivalence of a regular expression submatch and a 1327 * string. 1328 * @param __lhs A regular expression submatch. 1329 * @param __rhs A null-terminated string. 1330 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1331 */ 1332 template<typename _Bi_iter> 1333 inline bool 1334 operator!=(const sub_match<_Bi_iter>& __lhs, 1335 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1336 { return !(__lhs == __rhs); } 1337 1338 /** 1339 * @brief Tests the ordering of a regular expression submatch and a C string. 1340 * @param __lhs A regular expression submatch. 1341 * @param __rhs A null-terminated string. 1342 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1343 */ 1344 template<typename _Bi_iter> 1345 inline bool 1346 operator<(const sub_match<_Bi_iter>& __lhs, 1347 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1348 { return __lhs.compare(__rhs) < 0; } 1349 1350 /** 1351 * @brief Tests the ordering of a regular expression submatch and a C string. 1352 * @param __lhs A regular expression submatch. 1353 * @param __rhs A null-terminated string. 1354 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1355 */ 1356 template<typename _Bi_iter> 1357 inline bool 1358 operator>(const sub_match<_Bi_iter>& __lhs, 1359 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1360 { return __rhs < __lhs; } 1361 1362 /** 1363 * @brief Tests the ordering of a regular expression submatch and a C string. 1364 * @param __lhs A regular expression submatch. 1365 * @param __rhs A null-terminated string. 1366 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1367 */ 1368 template<typename _Bi_iter> 1369 inline bool 1370 operator>=(const sub_match<_Bi_iter>& __lhs, 1371 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1372 { return !(__lhs < __rhs); } 1373 1374 /** 1375 * @brief Tests the ordering of a regular expression submatch and a C string. 1376 * @param __lhs A regular expression submatch. 1377 * @param __rhs A null-terminated string. 1378 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1379 */ 1380 template<typename _Bi_iter> 1381 inline bool 1382 operator<=(const sub_match<_Bi_iter>& __lhs, 1383 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1384 { return !(__rhs < __lhs); } 1385 1386 /** 1387 * @brief Tests the equivalence of a character and a regular expression 1388 * submatch. 1389 * @param __lhs A character. 1390 * @param __rhs A regular expression submatch. 1391 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1392 */ 1393 template<typename _Bi_iter> 1394 inline bool 1395 operator==(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1396 const sub_match<_Bi_iter>& __rhs) 1397 { return __rhs._M_compare(std::__addressof(__lhs), 1) == 0; } 1398 1399 /** 1400 * @brief Tests the inequivalence of a character and a regular expression 1401 * submatch. 1402 * @param __lhs A character. 1403 * @param __rhs A regular expression submatch. 1404 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1405 */ 1406 template<typename _Bi_iter> 1407 inline bool 1408 operator!=(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1409 const sub_match<_Bi_iter>& __rhs) 1410 { return !(__lhs == __rhs); } 1411 1412 /** 1413 * @brief Tests the ordering of a character and a regular expression 1414 * submatch. 1415 * @param __lhs A character. 1416 * @param __rhs A regular expression submatch. 1417 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1418 */ 1419 template<typename _Bi_iter> 1420 inline bool 1421 operator<(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1422 const sub_match<_Bi_iter>& __rhs) 1423 { return __rhs._M_compare(std::__addressof(__lhs), 1) > 0; } 1424 1425 /** 1426 * @brief Tests the ordering of a character and a regular expression 1427 * submatch. 1428 * @param __lhs A character. 1429 * @param __rhs A regular expression submatch. 1430 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1431 */ 1432 template<typename _Bi_iter> 1433 inline bool 1434 operator>(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1435 const sub_match<_Bi_iter>& __rhs) 1436 { return __rhs < __lhs; } 1437 1438 /** 1439 * @brief Tests the ordering of a character and a regular expression 1440 * submatch. 1441 * @param __lhs A character. 1442 * @param __rhs A regular expression submatch. 1443 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1444 */ 1445 template<typename _Bi_iter> 1446 inline bool 1447 operator>=(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1448 const sub_match<_Bi_iter>& __rhs) 1449 { return !(__lhs < __rhs); } 1450 1451 /** 1452 * @brief Tests the ordering of a character and a regular expression 1453 * submatch. 1454 * @param __lhs A character. 1455 * @param __rhs A regular expression submatch. 1456 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1457 */ 1458 template<typename _Bi_iter> 1459 inline bool 1460 operator<=(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1461 const sub_match<_Bi_iter>& __rhs) 1462 { return !(__rhs < __lhs); } 1463 1464 /** 1465 * @brief Tests the equivalence of a regular expression submatch and a 1466 * character. 1467 * @param __lhs A regular expression submatch. 1468 * @param __rhs A character. 1469 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1470 */ 1471 template<typename _Bi_iter> 1472 inline bool 1473 operator==(const sub_match<_Bi_iter>& __lhs, 1474 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1475 { return __lhs._M_compare(std::__addressof(__rhs), 1) == 0; } 1476 1477 /** 1478 * @brief Tests the inequivalence of a regular expression submatch and a 1479 * character. 1480 * @param __lhs A regular expression submatch. 1481 * @param __rhs A character. 1482 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1483 */ 1484 template<typename _Bi_iter> 1485 inline bool 1486 operator!=(const sub_match<_Bi_iter>& __lhs, 1487 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1488 { return !(__lhs == __rhs); } 1489 1490 /** 1491 * @brief Tests the ordering of a regular expression submatch and a 1492 * character. 1493 * @param __lhs A regular expression submatch. 1494 * @param __rhs A character. 1495 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1496 */ 1497 template<typename _Bi_iter> 1498 inline bool 1499 operator<(const sub_match<_Bi_iter>& __lhs, 1500 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1501 { return __lhs._M_compare(std::__addressof(__rhs), 1) < 0; } 1502 1503 /** 1504 * @brief Tests the ordering of a regular expression submatch and a 1505 * character. 1506 * @param __lhs A regular expression submatch. 1507 * @param __rhs A character. 1508 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1509 */ 1510 template<typename _Bi_iter> 1511 inline bool 1512 operator>(const sub_match<_Bi_iter>& __lhs, 1513 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1514 { return __rhs < __lhs; } 1515 1516 /** 1517 * @brief Tests the ordering of a regular expression submatch and a 1518 * character. 1519 * @param __lhs A regular expression submatch. 1520 * @param __rhs A character. 1521 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1522 */ 1523 template<typename _Bi_iter> 1524 inline bool 1525 operator>=(const sub_match<_Bi_iter>& __lhs, 1526 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1527 { return !(__lhs < __rhs); } 1528 1529 /** 1530 * @brief Tests the ordering of a regular expression submatch and a 1531 * character. 1532 * @param __lhs A regular expression submatch. 1533 * @param __rhs A character. 1534 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1535 */ 1536 template<typename _Bi_iter> 1537 inline bool 1538 operator<=(const sub_match<_Bi_iter>& __lhs, 1539 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1540 { return !(__rhs < __lhs); } 1541 1542 /** 1543 * @brief Inserts a matched string into an output stream. 1544 * 1545 * @param __os The output stream. 1546 * @param __m A submatch string. 1547 * 1548 * @returns the output stream with the submatch string inserted. 1549 */ 1550 template<typename _Ch_type, typename _Ch_traits, typename _Bi_iter> 1551 inline 1552 basic_ostream<_Ch_type, _Ch_traits>& 1553 operator<<(basic_ostream<_Ch_type, _Ch_traits>& __os, 1554 const sub_match<_Bi_iter>& __m) 1555 { return __os << __m.str(); } 1556 1557 // [7.10] Class template match_results 1558 1559 /** 1560 * @brief The results of a match or search operation. 1561 * 1562 * A collection of character sequences representing the result of a regular 1563 * expression match. Storage for the collection is allocated and freed as 1564 * necessary by the member functions of class template match_results. 1565 * 1566 * This class satisfies the Sequence requirements, with the exception that 1567 * only the operations defined for a const-qualified Sequence are supported. 1568 * 1569 * The sub_match object stored at index 0 represents sub-expression 0, i.e. 1570 * the whole match. In this case the %sub_match member matched is always true. 1571 * The sub_match object stored at index n denotes what matched the marked 1572 * sub-expression n within the matched expression. If the sub-expression n 1573 * participated in a regular expression match then the %sub_match member 1574 * matched evaluates to true, and members first and second denote the range 1575 * of characters [first, second) which formed that match. Otherwise matched 1576 * is false, and members first and second point to the end of the sequence 1577 * that was searched. 1578 * 1579 * @nosubgrouping 1580 */ 1581 template<typename _Bi_iter, 1582 typename _Alloc = allocator<sub_match<_Bi_iter> > > 1583 class match_results 1584 : private std::vector<sub_match<_Bi_iter>, _Alloc> 1585 { 1586 private: 1587 /* 1588 * The vector base is empty if this does not represent a match (!ready()); 1589 * Otherwise if it's a match failure, it contains 3 elements: 1590 * [0] unmatched 1591 * [1] prefix 1592 * [2] suffix 1593 * Otherwise it contains n+4 elements where n is the number of marked 1594 * sub-expressions: 1595 * [0] entire match 1596 * [1] 1st marked subexpression 1597 * ... 1598 * [n] nth marked subexpression 1599 * [n+1] unmatched 1600 * [n+2] prefix 1601 * [n+3] suffix 1602 */ 1603 typedef std::vector<sub_match<_Bi_iter>, _Alloc> _Base_type; 1604 typedef std::iterator_traits<_Bi_iter> __iter_traits; 1605 typedef regex_constants::match_flag_type match_flag_type; 1606 1607 public: 1608 /** 1609 * @name 10.? Public Types 1610 */ 1611 //@{ 1612 typedef sub_match<_Bi_iter> value_type; 1613 typedef const value_type& const_reference; 1614 typedef value_type& reference; 1615 typedef typename _Base_type::const_iterator const_iterator; 1616 typedef const_iterator iterator; 1617 typedef typename __iter_traits::difference_type difference_type; 1618 typedef typename allocator_traits<_Alloc>::size_type size_type; 1619 typedef _Alloc allocator_type; 1620 typedef typename __iter_traits::value_type char_type; 1621 typedef std::basic_string<char_type> string_type; 1622 //@} 1623 1624 public: 1625 /** 1626 * @name 28.10.1 Construction, Copying, and Destruction 1627 */ 1628 //@{ 1629 1630 /** 1631 * @brief Constructs a default %match_results container. 1632 * @post size() returns 0 and str() returns an empty string. 1633 * @{ 1634 */ 1635 match_results() : match_results(_Alloc()) { } 1636 1637 explicit 1638 match_results(const _Alloc& __a) noexcept 1639 : _Base_type(__a) 1640 { } 1641 1642 // @} 1643 1644 /** 1645 * @brief Copy constructs a %match_results. 1646 */ 1647 match_results(const match_results&) = default; 1648 1649 /** 1650 * @brief Move constructs a %match_results. 1651 */ 1652 match_results(match_results&&) noexcept = default; 1653 1654 /** 1655 * @brief Assigns rhs to *this. 1656 */ 1657 match_results& 1658 operator=(const match_results&) = default; 1659 1660 /** 1661 * @brief Move-assigns rhs to *this. 1662 */ 1663 match_results& 1664 operator=(match_results&&) = default; 1665 1666 /** 1667 * @brief Destroys a %match_results object. 1668 */ 1669 ~match_results() = default; 1670 1671 //@} 1672 1673 // 28.10.2, state: 1674 /** 1675 * @brief Indicates if the %match_results is ready. 1676 * @retval true The object has a fully-established result state. 1677 * @retval false The object is not ready. 1678 */ 1679 bool ready() const noexcept { return !_Base_type::empty(); } 1680 1681 /** 1682 * @name 28.10.2 Size 1683 */ 1684 //@{ 1685 1686 /** 1687 * @brief Gets the number of matches and submatches. 1688 * 1689 * The number of matches for a given regular expression will be either 0 1690 * if there was no match or mark_count() + 1 if a match was successful. 1691 * Some matches may be empty. 1692 * 1693 * @returns the number of matches found. 1694 */ 1695 size_type 1696 size() const noexcept 1697 { return _Base_type::empty() ? 0 : _Base_type::size() - 3; } 1698 1699 size_type 1700 max_size() const noexcept 1701 { return _Base_type::max_size(); } 1702 1703 /** 1704 * @brief Indicates if the %match_results contains no results. 1705 * @retval true The %match_results object is empty. 1706 * @retval false The %match_results object is not empty. 1707 */ 1708 _GLIBCXX_NODISCARD bool 1709 empty() const noexcept 1710 { return size() == 0; } 1711 1712 //@} 1713 1714 /** 1715 * @name 10.3 Element Access 1716 */ 1717 //@{ 1718 1719 /** 1720 * @brief Gets the length of the indicated submatch. 1721 * @param __sub indicates the submatch. 1722 * @pre ready() == true 1723 * 1724 * This function returns the length of the indicated submatch, or the 1725 * length of the entire match if @p __sub is zero (the default). 1726 */ 1727 difference_type 1728 length(size_type __sub = 0) const 1729 { return (*this)[__sub].length(); } 1730 1731 /** 1732 * @brief Gets the offset of the beginning of the indicated submatch. 1733 * @param __sub indicates the submatch. 1734 * @pre ready() == true 1735 * 1736 * This function returns the offset from the beginning of the target 1737 * sequence to the beginning of the submatch, unless the value of @p __sub 1738 * is zero (the default), in which case this function returns the offset 1739 * from the beginning of the target sequence to the beginning of the 1740 * match. 1741 */ 1742 difference_type 1743 position(size_type __sub = 0) const 1744 { return std::distance(_M_begin, (*this)[__sub].first); } 1745 1746 /** 1747 * @brief Gets the match or submatch converted to a string type. 1748 * @param __sub indicates the submatch. 1749 * @pre ready() == true 1750 * 1751 * This function gets the submatch (or match, if @p __sub is 1752 * zero) extracted from the target range and converted to the 1753 * associated string type. 1754 */ 1755 string_type 1756 str(size_type __sub = 0) const 1757 { return string_type((*this)[__sub]); } 1758 1759 /** 1760 * @brief Gets a %sub_match reference for the match or submatch. 1761 * @param __sub indicates the submatch. 1762 * @pre ready() == true 1763 * 1764 * This function gets a reference to the indicated submatch, or 1765 * the entire match if @p __sub is zero. 1766 * 1767 * If @p __sub >= size() then this function returns a %sub_match with a 1768 * special value indicating no submatch. 1769 */ 1770 const_reference 1771 operator[](size_type __sub) const 1772 { 1773 __glibcxx_assert( ready() ); 1774 return __sub < size() 1775 ? _Base_type::operator[](__sub) 1776 : _M_unmatched_sub(); 1777 } 1778 1779 /** 1780 * @brief Gets a %sub_match representing the match prefix. 1781 * @pre ready() == true 1782 * 1783 * This function gets a reference to a %sub_match object representing the 1784 * part of the target range between the start of the target range and the 1785 * start of the match. 1786 */ 1787 const_reference 1788 prefix() const 1789 { 1790 __glibcxx_assert( ready() ); 1791 return !empty() ? _M_prefix() : _M_unmatched_sub(); 1792 } 1793 1794 /** 1795 * @brief Gets a %sub_match representing the match suffix. 1796 * @pre ready() == true 1797 * 1798 * This function gets a reference to a %sub_match object representing the 1799 * part of the target range between the end of the match and the end of 1800 * the target range. 1801 */ 1802 const_reference 1803 suffix() const 1804 { 1805 __glibcxx_assert( ready() ); 1806 return !empty() ? _M_suffix() : _M_unmatched_sub(); 1807 } 1808 1809 /** 1810 * @brief Gets an iterator to the start of the %sub_match collection. 1811 */ 1812 const_iterator 1813 begin() const noexcept 1814 { return _Base_type::begin(); } 1815 1816 /** 1817 * @brief Gets an iterator to the start of the %sub_match collection. 1818 */ 1819 const_iterator 1820 cbegin() const noexcept 1821 { return this->begin(); } 1822 1823 /** 1824 * @brief Gets an iterator to one-past-the-end of the collection. 1825 */ 1826 const_iterator 1827 end() const noexcept 1828 { return _Base_type::end() - (empty() ? 0 : 3); } 1829 1830 /** 1831 * @brief Gets an iterator to one-past-the-end of the collection. 1832 */ 1833 const_iterator 1834 cend() const noexcept 1835 { return this->end(); } 1836 1837 //@} 1838 1839 /** 1840 * @name 10.4 Formatting 1841 * 1842 * These functions perform formatted substitution of the matched 1843 * character sequences into their target. The format specifiers and 1844 * escape sequences accepted by these functions are determined by 1845 * their @p flags parameter as documented above. 1846 */ 1847 //@{ 1848 1849 /** 1850 * @pre ready() == true 1851 */ 1852 template<typename _Out_iter> 1853 _Out_iter 1854 format(_Out_iter __out, const char_type* __fmt_first, 1855 const char_type* __fmt_last, 1856 match_flag_type __flags = regex_constants::format_default) const; 1857 1858 /** 1859 * @pre ready() == true 1860 */ 1861 template<typename _Out_iter, typename _St, typename _Sa> 1862 _Out_iter 1863 format(_Out_iter __out, const basic_string<char_type, _St, _Sa>& __fmt, 1864 match_flag_type __flags = regex_constants::format_default) const 1865 { 1866 return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), 1867 __flags); 1868 } 1869 1870 /** 1871 * @pre ready() == true 1872 */ 1873 template<typename _St, typename _Sa> 1874 basic_string<char_type, _St, _Sa> 1875 format(const basic_string<char_type, _St, _Sa>& __fmt, 1876 match_flag_type __flags = regex_constants::format_default) const 1877 { 1878 basic_string<char_type, _St, _Sa> __result; 1879 format(std::back_inserter(__result), __fmt, __flags); 1880 return __result; 1881 } 1882 1883 /** 1884 * @pre ready() == true 1885 */ 1886 string_type 1887 format(const char_type* __fmt, 1888 match_flag_type __flags = regex_constants::format_default) const 1889 { 1890 string_type __result; 1891 format(std::back_inserter(__result), 1892 __fmt, 1893 __fmt + char_traits<char_type>::length(__fmt), 1894 __flags); 1895 return __result; 1896 } 1897 1898 //@} 1899 1900 /** 1901 * @name 10.5 Allocator 1902 */ 1903 //@{ 1904 1905 /** 1906 * @brief Gets a copy of the allocator. 1907 */ 1908 allocator_type 1909 get_allocator() const noexcept 1910 { return _Base_type::get_allocator(); } 1911 1912 //@} 1913 1914 /** 1915 * @name 10.6 Swap 1916 */ 1917 //@{ 1918 1919 /** 1920 * @brief Swaps the contents of two match_results. 1921 */ 1922 void 1923 swap(match_results& __that) noexcept 1924 { 1925 using std::swap; 1926 _Base_type::swap(__that); 1927 swap(_M_begin, __that._M_begin); 1928 } 1929 //@} 1930 1931 private: 1932 template<typename, typename, typename, bool> 1933 friend class __detail::_Executor; 1934 1935 template<typename, typename, typename> 1936 friend class regex_iterator; 1937 1938 template<typename _Bp, typename _Ap, typename _Cp, typename _Rp, 1939 __detail::_RegexExecutorPolicy, bool> 1940 friend bool 1941 __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&, 1942 const basic_regex<_Cp, _Rp>&, 1943 regex_constants::match_flag_type); 1944 1945 void 1946 _M_resize(unsigned int __size) 1947 { _Base_type::resize(__size + 3); } 1948 1949 const_reference 1950 _M_unmatched_sub() const 1951 { return _Base_type::operator[](_Base_type::size() - 3); } 1952 1953 sub_match<_Bi_iter>& 1954 _M_unmatched_sub() 1955 { return _Base_type::operator[](_Base_type::size() - 3); } 1956 1957 const_reference 1958 _M_prefix() const 1959 { return _Base_type::operator[](_Base_type::size() - 2); } 1960 1961 sub_match<_Bi_iter>& 1962 _M_prefix() 1963 { return _Base_type::operator[](_Base_type::size() - 2); } 1964 1965 const_reference 1966 _M_suffix() const 1967 { return _Base_type::operator[](_Base_type::size() - 1); } 1968 1969 sub_match<_Bi_iter>& 1970 _M_suffix() 1971 { return _Base_type::operator[](_Base_type::size() - 1); } 1972 1973 _Bi_iter _M_begin; 1974 }; 1975 1976 typedef match_results<const char*> cmatch; 1977 typedef match_results<string::const_iterator> smatch; 1978 #ifdef _GLIBCXX_USE_WCHAR_T 1979 typedef match_results<const wchar_t*> wcmatch; 1980 typedef match_results<wstring::const_iterator> wsmatch; 1981 #endif 1982 1983 // match_results comparisons 1984 /** 1985 * @brief Compares two match_results for equality. 1986 * @returns true if the two objects refer to the same match, 1987 * false otherwise. 1988 */ 1989 template<typename _Bi_iter, typename _Alloc> 1990 inline bool 1991 operator==(const match_results<_Bi_iter, _Alloc>& __m1, 1992 const match_results<_Bi_iter, _Alloc>& __m2) noexcept 1993 { 1994 if (__m1.ready() != __m2.ready()) 1995 return false; 1996 if (!__m1.ready()) // both are not ready 1997 return true; 1998 if (__m1.empty() != __m2.empty()) 1999 return false; 2000 if (__m1.empty()) // both are empty 2001 return true; 2002 return __m1.prefix() == __m2.prefix() 2003 && __m1.size() == __m2.size() 2004 && std::equal(__m1.begin(), __m1.end(), __m2.begin()) 2005 && __m1.suffix() == __m2.suffix(); 2006 } 2007 2008 /** 2009 * @brief Compares two match_results for inequality. 2010 * @returns true if the two objects do not refer to the same match, 2011 * false otherwise. 2012 */ 2013 template<typename _Bi_iter, class _Alloc> 2014 inline bool 2015 operator!=(const match_results<_Bi_iter, _Alloc>& __m1, 2016 const match_results<_Bi_iter, _Alloc>& __m2) noexcept 2017 { return !(__m1 == __m2); } 2018 2019 // [7.10.6] match_results swap 2020 /** 2021 * @brief Swaps two match results. 2022 * @param __lhs A match result. 2023 * @param __rhs A match result. 2024 * 2025 * The contents of the two match_results objects are swapped. 2026 */ 2027 template<typename _Bi_iter, typename _Alloc> 2028 inline void 2029 swap(match_results<_Bi_iter, _Alloc>& __lhs, 2030 match_results<_Bi_iter, _Alloc>& __rhs) noexcept 2031 { __lhs.swap(__rhs); } 2032 2033 _GLIBCXX_END_NAMESPACE_CXX11 2034 2035 // [7.11.2] Function template regex_match 2036 /** 2037 * @name Matching, Searching, and Replacing 2038 */ 2039 //@{ 2040 2041 /** 2042 * @brief Determines if there is a match between the regular expression @p e 2043 * and all of the character sequence [first, last). 2044 * 2045 * @param __s Start of the character sequence to match. 2046 * @param __e One-past-the-end of the character sequence to match. 2047 * @param __m The match results. 2048 * @param __re The regular expression. 2049 * @param __flags Controls how the regular expression is matched. 2050 * 2051 * @retval true A match exists. 2052 * @retval false Otherwise. 2053 * 2054 * @throws an exception of type regex_error. 2055 */ 2056 template<typename _Bi_iter, typename _Alloc, 2057 typename _Ch_type, typename _Rx_traits> 2058 inline bool 2059 regex_match(_Bi_iter __s, 2060 _Bi_iter __e, 2061 match_results<_Bi_iter, _Alloc>& __m, 2062 const basic_regex<_Ch_type, _Rx_traits>& __re, 2063 regex_constants::match_flag_type __flags 2064 = regex_constants::match_default) 2065 { 2066 return __detail::__regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, 2067 __detail::_RegexExecutorPolicy::_S_auto, true> 2068 (__s, __e, __m, __re, __flags); 2069 } 2070 2071 /** 2072 * @brief Indicates if there is a match between the regular expression @p e 2073 * and all of the character sequence [first, last). 2074 * 2075 * @param __first Beginning of the character sequence to match. 2076 * @param __last One-past-the-end of the character sequence to match. 2077 * @param __re The regular expression. 2078 * @param __flags Controls how the regular expression is matched. 2079 * 2080 * @retval true A match exists. 2081 * @retval false Otherwise. 2082 * 2083 * @throws an exception of type regex_error. 2084 */ 2085 template<typename _Bi_iter, typename _Ch_type, typename _Rx_traits> 2086 inline bool 2087 regex_match(_Bi_iter __first, _Bi_iter __last, 2088 const basic_regex<_Ch_type, _Rx_traits>& __re, 2089 regex_constants::match_flag_type __flags 2090 = regex_constants::match_default) 2091 { 2092 match_results<_Bi_iter> __what; 2093 return regex_match(__first, __last, __what, __re, __flags); 2094 } 2095 2096 /** 2097 * @brief Determines if there is a match between the regular expression @p e 2098 * and a C-style null-terminated string. 2099 * 2100 * @param __s The C-style null-terminated string to match. 2101 * @param __m The match results. 2102 * @param __re The regular expression. 2103 * @param __f Controls how the regular expression is matched. 2104 * 2105 * @retval true A match exists. 2106 * @retval false Otherwise. 2107 * 2108 * @throws an exception of type regex_error. 2109 */ 2110 template<typename _Ch_type, typename _Alloc, typename _Rx_traits> 2111 inline bool 2112 regex_match(const _Ch_type* __s, 2113 match_results<const _Ch_type*, _Alloc>& __m, 2114 const basic_regex<_Ch_type, _Rx_traits>& __re, 2115 regex_constants::match_flag_type __f 2116 = regex_constants::match_default) 2117 { return regex_match(__s, __s + _Rx_traits::length(__s), __m, __re, __f); } 2118 2119 /** 2120 * @brief Determines if there is a match between the regular expression @p e 2121 * and a string. 2122 * 2123 * @param __s The string to match. 2124 * @param __m The match results. 2125 * @param __re The regular expression. 2126 * @param __flags Controls how the regular expression is matched. 2127 * 2128 * @retval true A match exists. 2129 * @retval false Otherwise. 2130 * 2131 * @throws an exception of type regex_error. 2132 */ 2133 template<typename _Ch_traits, typename _Ch_alloc, 2134 typename _Alloc, typename _Ch_type, typename _Rx_traits> 2135 inline bool 2136 regex_match(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>& __s, 2137 match_results<typename basic_string<_Ch_type, 2138 _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>& __m, 2139 const basic_regex<_Ch_type, _Rx_traits>& __re, 2140 regex_constants::match_flag_type __flags 2141 = regex_constants::match_default) 2142 { return regex_match(__s.begin(), __s.end(), __m, __re, __flags); } 2143 2144 // _GLIBCXX_RESOLVE_LIB_DEFECTS 2145 // 2329. regex_match() with match_results should forbid temporary strings 2146 /// Prevent unsafe attempts to get match_results from a temporary string. 2147 template<typename _Ch_traits, typename _Ch_alloc, 2148 typename _Alloc, typename _Ch_type, typename _Rx_traits> 2149 bool 2150 regex_match(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>&&, 2151 match_results<typename basic_string<_Ch_type, 2152 _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>&, 2153 const basic_regex<_Ch_type, _Rx_traits>&, 2154 regex_constants::match_flag_type 2155 = regex_constants::match_default) = delete; 2156 2157 /** 2158 * @brief Indicates if there is a match between the regular expression @p e 2159 * and a C-style null-terminated string. 2160 * 2161 * @param __s The C-style null-terminated string to match. 2162 * @param __re The regular expression. 2163 * @param __f Controls how the regular expression is matched. 2164 * 2165 * @retval true A match exists. 2166 * @retval false Otherwise. 2167 * 2168 * @throws an exception of type regex_error. 2169 */ 2170 template<typename _Ch_type, class _Rx_traits> 2171 inline bool 2172 regex_match(const _Ch_type* __s, 2173 const basic_regex<_Ch_type, _Rx_traits>& __re, 2174 regex_constants::match_flag_type __f 2175 = regex_constants::match_default) 2176 { return regex_match(__s, __s + _Rx_traits::length(__s), __re, __f); } 2177 2178 /** 2179 * @brief Indicates if there is a match between the regular expression @p e 2180 * and a string. 2181 * 2182 * @param __s [IN] The string to match. 2183 * @param __re [IN] The regular expression. 2184 * @param __flags [IN] Controls how the regular expression is matched. 2185 * 2186 * @retval true A match exists. 2187 * @retval false Otherwise. 2188 * 2189 * @throws an exception of type regex_error. 2190 */ 2191 template<typename _Ch_traits, typename _Str_allocator, 2192 typename _Ch_type, typename _Rx_traits> 2193 inline bool 2194 regex_match(const basic_string<_Ch_type, _Ch_traits, _Str_allocator>& __s, 2195 const basic_regex<_Ch_type, _Rx_traits>& __re, 2196 regex_constants::match_flag_type __flags 2197 = regex_constants::match_default) 2198 { return regex_match(__s.begin(), __s.end(), __re, __flags); } 2199 2200 // [7.11.3] Function template regex_search 2201 /** 2202 * Searches for a regular expression within a range. 2203 * @param __s [IN] The start of the string to search. 2204 * @param __e [IN] One-past-the-end of the string to search. 2205 * @param __m [OUT] The match results. 2206 * @param __re [IN] The regular expression to search for. 2207 * @param __flags [IN] Search policy flags. 2208 * @retval true A match was found within the string. 2209 * @retval false No match was found within the string, the content of %m is 2210 * undefined. 2211 * 2212 * @throws an exception of type regex_error. 2213 */ 2214 template<typename _Bi_iter, typename _Alloc, 2215 typename _Ch_type, typename _Rx_traits> 2216 inline bool 2217 regex_search(_Bi_iter __s, _Bi_iter __e, 2218 match_results<_Bi_iter, _Alloc>& __m, 2219 const basic_regex<_Ch_type, _Rx_traits>& __re, 2220 regex_constants::match_flag_type __flags 2221 = regex_constants::match_default) 2222 { 2223 return __detail::__regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, 2224 __detail::_RegexExecutorPolicy::_S_auto, false> 2225 (__s, __e, __m, __re, __flags); 2226 } 2227 2228 /** 2229 * Searches for a regular expression within a range. 2230 * @param __first [IN] The start of the string to search. 2231 * @param __last [IN] One-past-the-end of the string to search. 2232 * @param __re [IN] The regular expression to search for. 2233 * @param __flags [IN] Search policy flags. 2234 * @retval true A match was found within the string. 2235 * @retval false No match was found within the string. 2236 * 2237 * @throws an exception of type regex_error. 2238 */ 2239 template<typename _Bi_iter, typename _Ch_type, typename _Rx_traits> 2240 inline bool 2241 regex_search(_Bi_iter __first, _Bi_iter __last, 2242 const basic_regex<_Ch_type, _Rx_traits>& __re, 2243 regex_constants::match_flag_type __flags 2244 = regex_constants::match_default) 2245 { 2246 match_results<_Bi_iter> __what; 2247 return regex_search(__first, __last, __what, __re, __flags); 2248 } 2249 2250 /** 2251 * @brief Searches for a regular expression within a C-string. 2252 * @param __s [IN] A C-string to search for the regex. 2253 * @param __m [OUT] The set of regex matches. 2254 * @param __e [IN] The regex to search for in @p s. 2255 * @param __f [IN] The search flags. 2256 * @retval true A match was found within the string. 2257 * @retval false No match was found within the string, the content of %m is 2258 * undefined. 2259 * 2260 * @throws an exception of type regex_error. 2261 */ 2262 template<typename _Ch_type, class _Alloc, class _Rx_traits> 2263 inline bool 2264 regex_search(const _Ch_type* __s, 2265 match_results<const _Ch_type*, _Alloc>& __m, 2266 const basic_regex<_Ch_type, _Rx_traits>& __e, 2267 regex_constants::match_flag_type __f 2268 = regex_constants::match_default) 2269 { return regex_search(__s, __s + _Rx_traits::length(__s), __m, __e, __f); } 2270 2271 /** 2272 * @brief Searches for a regular expression within a C-string. 2273 * @param __s [IN] The C-string to search. 2274 * @param __e [IN] The regular expression to search for. 2275 * @param __f [IN] Search policy flags. 2276 * @retval true A match was found within the string. 2277 * @retval false No match was found within the string. 2278 * 2279 * @throws an exception of type regex_error. 2280 */ 2281 template<typename _Ch_type, typename _Rx_traits> 2282 inline bool 2283 regex_search(const _Ch_type* __s, 2284 const basic_regex<_Ch_type, _Rx_traits>& __e, 2285 regex_constants::match_flag_type __f 2286 = regex_constants::match_default) 2287 { return regex_search(__s, __s + _Rx_traits::length(__s), __e, __f); } 2288 2289 /** 2290 * @brief Searches for a regular expression within a string. 2291 * @param __s [IN] The string to search. 2292 * @param __e [IN] The regular expression to search for. 2293 * @param __flags [IN] Search policy flags. 2294 * @retval true A match was found within the string. 2295 * @retval false No match was found within the string. 2296 * 2297 * @throws an exception of type regex_error. 2298 */ 2299 template<typename _Ch_traits, typename _String_allocator, 2300 typename _Ch_type, typename _Rx_traits> 2301 inline bool 2302 regex_search(const basic_string<_Ch_type, _Ch_traits, 2303 _String_allocator>& __s, 2304 const basic_regex<_Ch_type, _Rx_traits>& __e, 2305 regex_constants::match_flag_type __flags 2306 = regex_constants::match_default) 2307 { return regex_search(__s.begin(), __s.end(), __e, __flags); } 2308 2309 /** 2310 * @brief Searches for a regular expression within a string. 2311 * @param __s [IN] A C++ string to search for the regex. 2312 * @param __m [OUT] The set of regex matches. 2313 * @param __e [IN] The regex to search for in @p s. 2314 * @param __f [IN] The search flags. 2315 * @retval true A match was found within the string. 2316 * @retval false No match was found within the string, the content of %m is 2317 * undefined. 2318 * 2319 * @throws an exception of type regex_error. 2320 */ 2321 template<typename _Ch_traits, typename _Ch_alloc, 2322 typename _Alloc, typename _Ch_type, 2323 typename _Rx_traits> 2324 inline bool 2325 regex_search(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>& __s, 2326 match_results<typename basic_string<_Ch_type, 2327 _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>& __m, 2328 const basic_regex<_Ch_type, _Rx_traits>& __e, 2329 regex_constants::match_flag_type __f 2330 = regex_constants::match_default) 2331 { return regex_search(__s.begin(), __s.end(), __m, __e, __f); } 2332 2333 // _GLIBCXX_RESOLVE_LIB_DEFECTS 2334 // 2329. regex_search() with match_results should forbid temporary strings 2335 /// Prevent unsafe attempts to get match_results from a temporary string. 2336 template<typename _Ch_traits, typename _Ch_alloc, 2337 typename _Alloc, typename _Ch_type, 2338 typename _Rx_traits> 2339 bool 2340 regex_search(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>&&, 2341 match_results<typename basic_string<_Ch_type, 2342 _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>&, 2343 const basic_regex<_Ch_type, _Rx_traits>&, 2344 regex_constants::match_flag_type 2345 = regex_constants::match_default) = delete; 2346 2347 // std [28.11.4] Function template regex_replace 2348 /** 2349 * @brief Search for a regular expression within a range for multiple times, 2350 and replace the matched parts through filling a format string. 2351 * @param __out [OUT] The output iterator. 2352 * @param __first [IN] The start of the string to search. 2353 * @param __last [IN] One-past-the-end of the string to search. 2354 * @param __e [IN] The regular expression to search for. 2355 * @param __fmt [IN] The format string. 2356 * @param __flags [IN] Search and replace policy flags. 2357 * 2358 * @returns __out 2359 * @throws an exception of type regex_error. 2360 */ 2361 template<typename _Out_iter, typename _Bi_iter, 2362 typename _Rx_traits, typename _Ch_type, 2363 typename _St, typename _Sa> 2364 inline _Out_iter 2365 regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last, 2366 const basic_regex<_Ch_type, _Rx_traits>& __e, 2367 const basic_string<_Ch_type, _St, _Sa>& __fmt, 2368 regex_constants::match_flag_type __flags 2369 = regex_constants::match_default) 2370 { 2371 return regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags); 2372 } 2373 2374 /** 2375 * @brief Search for a regular expression within a range for multiple times, 2376 and replace the matched parts through filling a format C-string. 2377 * @param __out [OUT] The output iterator. 2378 * @param __first [IN] The start of the string to search. 2379 * @param __last [IN] One-past-the-end of the string to search. 2380 * @param __e [IN] The regular expression to search for. 2381 * @param __fmt [IN] The format C-string. 2382 * @param __flags [IN] Search and replace policy flags. 2383 * 2384 * @returns __out 2385 * @throws an exception of type regex_error. 2386 */ 2387 template<typename _Out_iter, typename _Bi_iter, 2388 typename _Rx_traits, typename _Ch_type> 2389 _Out_iter 2390 regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last, 2391 const basic_regex<_Ch_type, _Rx_traits>& __e, 2392 const _Ch_type* __fmt, 2393 regex_constants::match_flag_type __flags 2394 = regex_constants::match_default); 2395 2396 /** 2397 * @brief Search for a regular expression within a string for multiple times, 2398 and replace the matched parts through filling a format string. 2399 * @param __s [IN] The string to search and replace. 2400 * @param __e [IN] The regular expression to search for. 2401 * @param __fmt [IN] The format string. 2402 * @param __flags [IN] Search and replace policy flags. 2403 * 2404 * @returns The string after replacing. 2405 * @throws an exception of type regex_error. 2406 */ 2407 template<typename _Rx_traits, typename _Ch_type, 2408 typename _St, typename _Sa, typename _Fst, typename _Fsa> 2409 inline basic_string<_Ch_type, _St, _Sa> 2410 regex_replace(const basic_string<_Ch_type, _St, _Sa>& __s, 2411 const basic_regex<_Ch_type, _Rx_traits>& __e, 2412 const basic_string<_Ch_type, _Fst, _Fsa>& __fmt, 2413 regex_constants::match_flag_type __flags 2414 = regex_constants::match_default) 2415 { 2416 basic_string<_Ch_type, _St, _Sa> __result; 2417 regex_replace(std::back_inserter(__result), 2418 __s.begin(), __s.end(), __e, __fmt, __flags); 2419 return __result; 2420 } 2421 2422 /** 2423 * @brief Search for a regular expression within a string for multiple times, 2424 and replace the matched parts through filling a format C-string. 2425 * @param __s [IN] The string to search and replace. 2426 * @param __e [IN] The regular expression to search for. 2427 * @param __fmt [IN] The format C-string. 2428 * @param __flags [IN] Search and replace policy flags. 2429 * 2430 * @returns The string after replacing. 2431 * @throws an exception of type regex_error. 2432 */ 2433 template<typename _Rx_traits, typename _Ch_type, 2434 typename _St, typename _Sa> 2435 inline basic_string<_Ch_type, _St, _Sa> 2436 regex_replace(const basic_string<_Ch_type, _St, _Sa>& __s, 2437 const basic_regex<_Ch_type, _Rx_traits>& __e, 2438 const _Ch_type* __fmt, 2439 regex_constants::match_flag_type __flags 2440 = regex_constants::match_default) 2441 { 2442 basic_string<_Ch_type, _St, _Sa> __result; 2443 regex_replace(std::back_inserter(__result), 2444 __s.begin(), __s.end(), __e, __fmt, __flags); 2445 return __result; 2446 } 2447 2448 /** 2449 * @brief Search for a regular expression within a C-string for multiple 2450 times, and replace the matched parts through filling a format string. 2451 * @param __s [IN] The C-string to search and replace. 2452 * @param __e [IN] The regular expression to search for. 2453 * @param __fmt [IN] The format string. 2454 * @param __flags [IN] Search and replace policy flags. 2455 * 2456 * @returns The string after replacing. 2457 * @throws an exception of type regex_error. 2458 */ 2459 template<typename _Rx_traits, typename _Ch_type, 2460 typename _St, typename _Sa> 2461 inline basic_string<_Ch_type> 2462 regex_replace(const _Ch_type* __s, 2463 const basic_regex<_Ch_type, _Rx_traits>& __e, 2464 const basic_string<_Ch_type, _St, _Sa>& __fmt, 2465 regex_constants::match_flag_type __flags 2466 = regex_constants::match_default) 2467 { 2468 basic_string<_Ch_type> __result; 2469 regex_replace(std::back_inserter(__result), __s, 2470 __s + char_traits<_Ch_type>::length(__s), 2471 __e, __fmt, __flags); 2472 return __result; 2473 } 2474 2475 /** 2476 * @brief Search for a regular expression within a C-string for multiple 2477 times, and replace the matched parts through filling a format C-string. 2478 * @param __s [IN] The C-string to search and replace. 2479 * @param __e [IN] The regular expression to search for. 2480 * @param __fmt [IN] The format C-string. 2481 * @param __flags [IN] Search and replace policy flags. 2482 * 2483 * @returns The string after replacing. 2484 * @throws an exception of type regex_error. 2485 */ 2486 template<typename _Rx_traits, typename _Ch_type> 2487 inline basic_string<_Ch_type> 2488 regex_replace(const _Ch_type* __s, 2489 const basic_regex<_Ch_type, _Rx_traits>& __e, 2490 const _Ch_type* __fmt, 2491 regex_constants::match_flag_type __flags 2492 = regex_constants::match_default) 2493 { 2494 basic_string<_Ch_type> __result; 2495 regex_replace(std::back_inserter(__result), __s, 2496 __s + char_traits<_Ch_type>::length(__s), 2497 __e, __fmt, __flags); 2498 return __result; 2499 } 2500 2501 //@} 2502 2503 _GLIBCXX_BEGIN_NAMESPACE_CXX11 2504 2505 // std [28.12] Class template regex_iterator 2506 /** 2507 * An iterator adaptor that will provide repeated calls of regex_search over 2508 * a range until no more matches remain. 2509 */ 2510 template<typename _Bi_iter, 2511 typename _Ch_type = typename iterator_traits<_Bi_iter>::value_type, 2512 typename _Rx_traits = regex_traits<_Ch_type> > 2513 class regex_iterator 2514 { 2515 public: 2516 typedef basic_regex<_Ch_type, _Rx_traits> regex_type; 2517 typedef match_results<_Bi_iter> value_type; 2518 typedef std::ptrdiff_t difference_type; 2519 typedef const value_type* pointer; 2520 typedef const value_type& reference; 2521 typedef std::forward_iterator_tag iterator_category; 2522 2523 /** 2524 * @brief Provides a singular iterator, useful for indicating 2525 * one-past-the-end of a range. 2526 */ 2527 regex_iterator() = default; 2528 2529 /** 2530 * Constructs a %regex_iterator... 2531 * @param __a [IN] The start of a text range to search. 2532 * @param __b [IN] One-past-the-end of the text range to search. 2533 * @param __re [IN] The regular expression to match. 2534 * @param __m [IN] Policy flags for match rules. 2535 */ 2536 regex_iterator(_Bi_iter __a, _Bi_iter __b, const regex_type& __re, 2537 regex_constants::match_flag_type __m 2538 = regex_constants::match_default) 2539 : _M_begin(__a), _M_end(__b), _M_pregex(&__re), _M_flags(__m), _M_match() 2540 { 2541 if (!regex_search(_M_begin, _M_end, _M_match, *_M_pregex, _M_flags)) 2542 *this = regex_iterator(); 2543 } 2544 2545 // _GLIBCXX_RESOLVE_LIB_DEFECTS 2546 // 2332. regex_iterator should forbid temporary regexes 2547 regex_iterator(_Bi_iter, _Bi_iter, const regex_type&&, 2548 regex_constants::match_flag_type 2549 = regex_constants::match_default) = delete; 2550 2551 /// Copy constructs a %regex_iterator. 2552 regex_iterator(const regex_iterator&) = default; 2553 2554 /// Copy assigns one %regex_iterator to another. 2555 regex_iterator& 2556 operator=(const regex_iterator&) = default; 2557 2558 ~regex_iterator() = default; 2559 2560 /** 2561 * @brief Tests the equivalence of two regex iterators. 2562 */ 2563 bool 2564 operator==(const regex_iterator&) const noexcept; 2565 2566 /** 2567 * @brief Tests the inequivalence of two regex iterators. 2568 */ 2569 bool 2570 operator!=(const regex_iterator& __rhs) const noexcept 2571 { return !(*this == __rhs); } 2572 2573 /** 2574 * @brief Dereferences a %regex_iterator. 2575 */ 2576 const value_type& 2577 operator*() const noexcept 2578 { return _M_match; } 2579 2580 /** 2581 * @brief Selects a %regex_iterator member. 2582 */ 2583 const value_type* 2584 operator->() const noexcept 2585 { return &_M_match; } 2586 2587 /** 2588 * @brief Increments a %regex_iterator. 2589 */ 2590 regex_iterator& 2591 operator++(); 2592 2593 /** 2594 * @brief Postincrements a %regex_iterator. 2595 */ 2596 regex_iterator 2597 operator++(int) 2598 { 2599 auto __tmp = *this; 2600 ++(*this); 2601 return __tmp; 2602 } 2603 2604 private: 2605 _Bi_iter _M_begin {}; 2606 _Bi_iter _M_end {}; 2607 const regex_type* _M_pregex = nullptr; 2608 regex_constants::match_flag_type _M_flags {}; 2609 match_results<_Bi_iter> _M_match; 2610 }; 2611 2612 typedef regex_iterator<const char*> cregex_iterator; 2613 typedef regex_iterator<string::const_iterator> sregex_iterator; 2614 #ifdef _GLIBCXX_USE_WCHAR_T 2615 typedef regex_iterator<const wchar_t*> wcregex_iterator; 2616 typedef regex_iterator<wstring::const_iterator> wsregex_iterator; 2617 #endif 2618 2619 // [7.12.2] Class template regex_token_iterator 2620 /** 2621 * Iterates over submatches in a range (or @a splits a text string). 2622 * 2623 * The purpose of this iterator is to enumerate all, or all specified, 2624 * matches of a regular expression within a text range. The dereferenced 2625 * value of an iterator of this class is a std::sub_match object. 2626 */ 2627 template<typename _Bi_iter, 2628 typename _Ch_type = typename iterator_traits<_Bi_iter>::value_type, 2629 typename _Rx_traits = regex_traits<_Ch_type> > 2630 class regex_token_iterator 2631 { 2632 public: 2633 typedef basic_regex<_Ch_type, _Rx_traits> regex_type; 2634 typedef sub_match<_Bi_iter> value_type; 2635 typedef std::ptrdiff_t difference_type; 2636 typedef const value_type* pointer; 2637 typedef const value_type& reference; 2638 typedef std::forward_iterator_tag iterator_category; 2639 2640 public: 2641 /** 2642 * @brief Default constructs a %regex_token_iterator. 2643 * 2644 * A default-constructed %regex_token_iterator is a singular iterator 2645 * that will compare equal to the one-past-the-end value for any 2646 * iterator of the same type. 2647 */ 2648 regex_token_iterator() 2649 : _M_position(), _M_subs(), _M_suffix(), _M_n(0), _M_result(nullptr), 2650 _M_has_m1(false) 2651 { } 2652 2653 /** 2654 * Constructs a %regex_token_iterator... 2655 * @param __a [IN] The start of the text to search. 2656 * @param __b [IN] One-past-the-end of the text to search. 2657 * @param __re [IN] The regular expression to search for. 2658 * @param __submatch [IN] Which submatch to return. There are some 2659 * special values for this parameter: 2660 * - -1 each enumerated subexpression does NOT 2661 * match the regular expression (aka field 2662 * splitting) 2663 * - 0 the entire string matching the 2664 * subexpression is returned for each match 2665 * within the text. 2666 * - >0 enumerates only the indicated 2667 * subexpression from a match within the text. 2668 * @param __m [IN] Policy flags for match rules. 2669 */ 2670 regex_token_iterator(_Bi_iter __a, _Bi_iter __b, const regex_type& __re, 2671 int __submatch = 0, 2672 regex_constants::match_flag_type __m 2673 = regex_constants::match_default) 2674 : _M_position(__a, __b, __re, __m), _M_subs(1, __submatch), _M_n(0) 2675 { _M_init(__a, __b); } 2676 2677 /** 2678 * Constructs a %regex_token_iterator... 2679 * @param __a [IN] The start of the text to search. 2680 * @param __b [IN] One-past-the-end of the text to search. 2681 * @param __re [IN] The regular expression to search for. 2682 * @param __submatches [IN] A list of subexpressions to return for each 2683 * regular expression match within the text. 2684 * @param __m [IN] Policy flags for match rules. 2685 */ 2686 regex_token_iterator(_Bi_iter __a, _Bi_iter __b, 2687 const regex_type& __re, 2688 const std::vector<int>& __submatches, 2689 regex_constants::match_flag_type __m 2690 = regex_constants::match_default) 2691 : _M_position(__a, __b, __re, __m), _M_subs(__submatches), _M_n(0) 2692 { _M_init(__a, __b); } 2693 2694 /** 2695 * Constructs a %regex_token_iterator... 2696 * @param __a [IN] The start of the text to search. 2697 * @param __b [IN] One-past-the-end of the text to search. 2698 * @param __re [IN] The regular expression to search for. 2699 * @param __submatches [IN] A list of subexpressions to return for each 2700 * regular expression match within the text. 2701 * @param __m [IN] Policy flags for match rules. 2702 */ 2703 regex_token_iterator(_Bi_iter __a, _Bi_iter __b, 2704 const regex_type& __re, 2705 initializer_list<int> __submatches, 2706 regex_constants::match_flag_type __m 2707 = regex_constants::match_default) 2708 : _M_position(__a, __b, __re, __m), _M_subs(__submatches), _M_n(0) 2709 { _M_init(__a, __b); } 2710 2711 /** 2712 * Constructs a %regex_token_iterator... 2713 * @param __a [IN] The start of the text to search. 2714 * @param __b [IN] One-past-the-end of the text to search. 2715 * @param __re [IN] The regular expression to search for. 2716 * @param __submatches [IN] A list of subexpressions to return for each 2717 * regular expression match within the text. 2718 * @param __m [IN] Policy flags for match rules. 2719 */ 2720 template<std::size_t _Nm> 2721 regex_token_iterator(_Bi_iter __a, _Bi_iter __b, 2722 const regex_type& __re, 2723 const int (&__submatches)[_Nm], 2724 regex_constants::match_flag_type __m 2725 = regex_constants::match_default) 2726 : _M_position(__a, __b, __re, __m), 2727 _M_subs(__submatches, __submatches + _Nm), _M_n(0) 2728 { _M_init(__a, __b); } 2729 2730 // _GLIBCXX_RESOLVE_LIB_DEFECTS 2731 // 2332. regex_token_iterator should forbid temporary regexes 2732 regex_token_iterator(_Bi_iter, _Bi_iter, const regex_type&&, int = 0, 2733 regex_constants::match_flag_type = 2734 regex_constants::match_default) = delete; 2735 regex_token_iterator(_Bi_iter, _Bi_iter, const regex_type&&, 2736 const std::vector<int>&, 2737 regex_constants::match_flag_type = 2738 regex_constants::match_default) = delete; 2739 regex_token_iterator(_Bi_iter, _Bi_iter, const regex_type&&, 2740 initializer_list<int>, 2741 regex_constants::match_flag_type = 2742 regex_constants::match_default) = delete; 2743 template <std::size_t _Nm> 2744 regex_token_iterator(_Bi_iter, _Bi_iter, const regex_type&&, 2745 const int (&)[_Nm], 2746 regex_constants::match_flag_type = 2747 regex_constants::match_default) = delete; 2748 2749 /** 2750 * @brief Copy constructs a %regex_token_iterator. 2751 * @param __rhs [IN] A %regex_token_iterator to copy. 2752 */ 2753 regex_token_iterator(const regex_token_iterator& __rhs) 2754 : _M_position(__rhs._M_position), _M_subs(__rhs._M_subs), 2755 _M_suffix(__rhs._M_suffix), _M_n(__rhs._M_n), _M_has_m1(__rhs._M_has_m1) 2756 { _M_normalize_result(); } 2757 2758 /** 2759 * @brief Assigns a %regex_token_iterator to another. 2760 * @param __rhs [IN] A %regex_token_iterator to copy. 2761 */ 2762 regex_token_iterator& 2763 operator=(const regex_token_iterator& __rhs); 2764 2765 /** 2766 * @brief Compares a %regex_token_iterator to another for equality. 2767 */ 2768 bool 2769 operator==(const regex_token_iterator& __rhs) const; 2770 2771 /** 2772 * @brief Compares a %regex_token_iterator to another for inequality. 2773 */ 2774 bool 2775 operator!=(const regex_token_iterator& __rhs) const 2776 { return !(*this == __rhs); } 2777 2778 /** 2779 * @brief Dereferences a %regex_token_iterator. 2780 */ 2781 const value_type& 2782 operator*() const 2783 { return *_M_result; } 2784 2785 /** 2786 * @brief Selects a %regex_token_iterator member. 2787 */ 2788 const value_type* 2789 operator->() const 2790 { return _M_result; } 2791 2792 /** 2793 * @brief Increments a %regex_token_iterator. 2794 */ 2795 regex_token_iterator& 2796 operator++(); 2797 2798 /** 2799 * @brief Postincrements a %regex_token_iterator. 2800 */ 2801 regex_token_iterator 2802 operator++(int) 2803 { 2804 auto __tmp = *this; 2805 ++(*this); 2806 return __tmp; 2807 } 2808 2809 private: 2810 typedef regex_iterator<_Bi_iter, _Ch_type, _Rx_traits> _Position; 2811 2812 void 2813 _M_init(_Bi_iter __a, _Bi_iter __b); 2814 2815 const value_type& 2816 _M_current_match() const 2817 { 2818 if (_M_subs[_M_n] == -1) 2819 return (*_M_position).prefix(); 2820 else 2821 return (*_M_position)[_M_subs[_M_n]]; 2822 } 2823 2824 constexpr bool 2825 _M_end_of_seq() const 2826 { return _M_result == nullptr; } 2827 2828 // [28.12.2.2.4] 2829 void 2830 _M_normalize_result() 2831 { 2832 if (_M_position != _Position()) 2833 _M_result = &_M_current_match(); 2834 else if (_M_has_m1) 2835 _M_result = &_M_suffix; 2836 else 2837 _M_result = nullptr; 2838 } 2839 2840 _Position _M_position; 2841 std::vector<int> _M_subs; 2842 value_type _M_suffix; 2843 std::size_t _M_n; 2844 const value_type* _M_result; 2845 2846 // Show whether _M_subs contains -1 2847 bool _M_has_m1; 2848 }; 2849 2850 /** @brief Token iterator for C-style NULL-terminated strings. */ 2851 typedef regex_token_iterator<const char*> cregex_token_iterator; 2852 2853 /** @brief Token iterator for standard strings. */ 2854 typedef regex_token_iterator<string::const_iterator> sregex_token_iterator; 2855 2856 #ifdef _GLIBCXX_USE_WCHAR_T 2857 /** @brief Token iterator for C-style NULL-terminated wide strings. */ 2858 typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator; 2859 2860 /** @brief Token iterator for standard wide-character strings. */ 2861 typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator; 2862 #endif 2863 2864 //@} // group regex 2865 2866 _GLIBCXX_END_NAMESPACE_CXX11 2867 _GLIBCXX_END_NAMESPACE_VERSION 2868 } // namespace 2869 2870 #include <bits/regex.tcc> 2871