Home | History | Annotate | Download | only in re.alg.replace
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <regex>
     11 
     12 // template <class OutputIterator, class BidirectionalIterator,
     13 //           class traits, class charT, class ST, class SA>
     14 //     OutputIterator
     15 //     regex_replace(OutputIterator out,
     16 //                   BidirectionalIterator first, BidirectionalIterator last,
     17 //                   const basic_regex<charT, traits>& e,
     18 //                   const charT* fmt,
     19 //                   regex_constants::match_flag_type flags =
     20 //                                              regex_constants::match_default);
     21 
     22 #include <regex>
     23 #include <cassert>
     24 
     25 #include "test_iterators.h"
     26 
     27 int main()
     28 {
     29     {
     30         std::regex phone_numbers("\\d{3}-\\d{4}");
     31         const char phone_book[] = "555-1234, 555-2345, 555-3456";
     32         typedef output_iterator<char*> Out;
     33         typedef bidirectional_iterator<const char*> Bi;
     34         char buf[100] = {0};
     35         Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
     36                                     Bi(std::end(phone_book)-1), phone_numbers,
     37                                     "123-$&");
     38         assert(r.base() == buf+40);
     39         assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456"));
     40     }
     41     {
     42         std::regex phone_numbers("\\d{3}-\\d{4}");
     43         const char phone_book[] = "555-1234, 555-2345, 555-3456";
     44         typedef output_iterator<char*> Out;
     45         typedef bidirectional_iterator<const char*> Bi;
     46         char buf[100] = {0};
     47         Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
     48                                     Bi(std::end(phone_book)-1), phone_numbers,
     49                                     "123-$&",
     50                                     std::regex_constants::format_sed);
     51         assert(r.base() == buf+43);
     52         assert(buf == std::string("123-$555-1234, 123-$555-2345, 123-$555-3456"));
     53     }
     54     {
     55         std::regex phone_numbers("\\d{3}-\\d{4}");
     56         const char phone_book[] = "555-1234, 555-2345, 555-3456";
     57         typedef output_iterator<char*> Out;
     58         typedef bidirectional_iterator<const char*> Bi;
     59         char buf[100] = {0};
     60         Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
     61                                     Bi(std::end(phone_book)-1), phone_numbers,
     62                                     "123-&",
     63                                     std::regex_constants::format_sed);
     64         assert(r.base() == buf+40);
     65         assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456"));
     66     }
     67     {
     68         std::regex phone_numbers("\\d{3}-\\d{4}");
     69         const char phone_book[] = "555-1234, 555-2345, 555-3456";
     70         typedef output_iterator<char*> Out;
     71         typedef bidirectional_iterator<const char*> Bi;
     72         char buf[100] = {0};
     73         Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
     74                                     Bi(std::end(phone_book)-1), phone_numbers,
     75                                     "123-$&",
     76                                     std::regex_constants::format_no_copy);
     77         assert(r.base() == buf+36);
     78         assert(buf == std::string("123-555-1234123-555-2345123-555-3456"));
     79     }
     80     {
     81         std::regex phone_numbers("\\d{3}-\\d{4}");
     82         const char phone_book[] = "555-1234, 555-2345, 555-3456";
     83         typedef output_iterator<char*> Out;
     84         typedef bidirectional_iterator<const char*> Bi;
     85         char buf[100] = {0};
     86         Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
     87                                     Bi(std::end(phone_book)-1), phone_numbers,
     88                                     "123-$&",
     89                                     std::regex_constants::format_first_only);
     90         assert(r.base() == buf+32);
     91         assert(buf == std::string("123-555-1234, 555-2345, 555-3456"));
     92     }
     93     {
     94         std::regex phone_numbers("\\d{3}-\\d{4}");
     95         const char phone_book[] = "555-1234, 555-2345, 555-3456";
     96         typedef output_iterator<char*> Out;
     97         typedef bidirectional_iterator<const char*> Bi;
     98         char buf[100] = {0};
     99         Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
    100                                     Bi(std::end(phone_book)-1), phone_numbers,
    101                                     "123-$&",
    102                                     std::regex_constants::format_first_only |
    103                                     std::regex_constants::format_no_copy);
    104         assert(r.base() == buf+12);
    105         assert(buf == std::string("123-555-1234"));
    106     }
    107 }
    108