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_macros.h"
26 #include "test_iterators.h"
27
main()28 int main()
29 {
30 {
31 std::regex phone_numbers("\\d{3}-\\d{4}");
32 const char phone_book[] = "555-1234, 555-2345, 555-3456";
33 typedef output_iterator<char*> Out;
34 typedef bidirectional_iterator<const char*> Bi;
35 char buf[100] = {0};
36 Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
37 Bi(std::end(phone_book)-1), phone_numbers,
38 "123-$&");
39 assert(r.base() == buf+40);
40 assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456"));
41 }
42 {
43 std::regex phone_numbers("\\d{3}-\\d{4}");
44 const char phone_book[] = "555-1234, 555-2345, 555-3456";
45 typedef output_iterator<char*> Out;
46 typedef bidirectional_iterator<const char*> Bi;
47 char buf[100] = {0};
48 Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
49 Bi(std::end(phone_book)-1), phone_numbers,
50 "123-$&",
51 std::regex_constants::format_sed);
52 assert(r.base() == buf+43);
53 assert(buf == std::string("123-$555-1234, 123-$555-2345, 123-$555-3456"));
54 }
55 {
56 std::regex phone_numbers("\\d{3}-\\d{4}");
57 const char phone_book[] = "555-1234, 555-2345, 555-3456";
58 typedef output_iterator<char*> Out;
59 typedef bidirectional_iterator<const char*> Bi;
60 char buf[100] = {0};
61 Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
62 Bi(std::end(phone_book)-1), phone_numbers,
63 "123-&",
64 std::regex_constants::format_sed);
65 assert(r.base() == buf+40);
66 assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456"));
67 }
68 {
69 std::regex phone_numbers("\\d{3}-\\d{4}");
70 const char phone_book[] = "555-1234, 555-2345, 555-3456";
71 typedef output_iterator<char*> Out;
72 typedef bidirectional_iterator<const char*> Bi;
73 char buf[100] = {0};
74 Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
75 Bi(std::end(phone_book)-1), phone_numbers,
76 "123-$&",
77 std::regex_constants::format_no_copy);
78 assert(r.base() == buf+36);
79 assert(buf == std::string("123-555-1234123-555-2345123-555-3456"));
80 }
81 {
82 std::regex phone_numbers("\\d{3}-\\d{4}");
83 const char phone_book[] = "555-1234, 555-2345, 555-3456";
84 typedef output_iterator<char*> Out;
85 typedef bidirectional_iterator<const char*> Bi;
86 char buf[100] = {0};
87 Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
88 Bi(std::end(phone_book)-1), phone_numbers,
89 "123-$&",
90 std::regex_constants::format_first_only);
91 assert(r.base() == buf+32);
92 assert(buf == std::string("123-555-1234, 555-2345, 555-3456"));
93 }
94 {
95 std::regex phone_numbers("\\d{3}-\\d{4}");
96 const char phone_book[] = "555-1234, 555-2345, 555-3456";
97 typedef output_iterator<char*> Out;
98 typedef bidirectional_iterator<const char*> Bi;
99 char buf[100] = {0};
100 Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)),
101 Bi(std::end(phone_book)-1), phone_numbers,
102 "123-$&",
103 std::regex_constants::format_first_only |
104 std::regex_constants::format_no_copy);
105 assert(r.base() == buf+12);
106 assert(buf == std::string("123-555-1234"));
107 }
108 }
109