• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 BidirectionalIterator, class Allocator, class charT, class traits>
13 //     bool
14 //     regex_search(BidirectionalIterator first, BidirectionalIterator last,
15 //                  match_results<BidirectionalIterator, Allocator>& m,
16 //                  const basic_regex<charT, traits>& e,
17 //                  regex_constants::match_flag_type flags = regex_constants::match_default);
18 
19 #include <regex>
20 #include <cassert>
21 
22 #include "test_iterators.h"
23 
main()24 int main()
25 {
26     {
27         std::cmatch m;
28         const char s[] = "a";
29         assert(std::regex_search(s, m, std::regex("a", std::regex_constants::awk)));
30         assert(m.size() == 1);
31         assert(!m.empty());
32         assert(!m.prefix().matched);
33         assert(m.prefix().first == s);
34         assert(m.prefix().second == m[0].first);
35         assert(!m.suffix().matched);
36         assert(m.suffix().first == m[0].second);
37         assert(m.suffix().second == s+1);
38         assert(m.length(0) == 1);
39         assert(m.position(0) == 0);
40         assert(m.str(0) == "a");
41     }
42     {
43         std::cmatch m;
44         const char s[] = "ab";
45         assert(std::regex_search(s, m, std::regex("ab", std::regex_constants::awk)));
46         assert(m.size() == 1);
47         assert(!m.prefix().matched);
48         assert(m.prefix().first == s);
49         assert(m.prefix().second == m[0].first);
50         assert(!m.suffix().matched);
51         assert(m.suffix().first == m[0].second);
52         assert(m.suffix().second == s+2);
53         assert(m.length(0) == 2);
54         assert(m.position(0) == 0);
55         assert(m.str(0) == "ab");
56     }
57     {
58         std::cmatch m;
59         const char s[] = "ab";
60         assert(!std::regex_search(s, m, std::regex("ba", std::regex_constants::awk)));
61         assert(m.size() == 0);
62         assert(m.empty());
63     }
64     {
65         std::cmatch m;
66         const char s[] = "aab";
67         assert(std::regex_search(s, m, std::regex("ab", std::regex_constants::awk)));
68         assert(m.size() == 1);
69         assert(m.prefix().matched);
70         assert(m.prefix().first == s);
71         assert(m.prefix().second == m[0].first);
72         assert(!m.suffix().matched);
73         assert(m.suffix().first == m[0].second);
74         assert(m.suffix().second == s+3);
75         assert(m.length(0) == 2);
76         assert(m.position(0) == 1);
77         assert(m.str(0) == "ab");
78     }
79     {
80         std::cmatch m;
81         const char s[] = "aab";
82         assert(!std::regex_search(s, m, std::regex("ab", std::regex_constants::awk),
83                                             std::regex_constants::match_continuous));
84         assert(m.size() == 0);
85     }
86     {
87         std::cmatch m;
88         const char s[] = "abcd";
89         assert(std::regex_search(s, m, std::regex("bc", std::regex_constants::awk)));
90         assert(m.size() == 1);
91         assert(m.prefix().matched);
92         assert(m.prefix().first == s);
93         assert(m.prefix().second == m[0].first);
94         assert(m.suffix().matched);
95         assert(m.suffix().first == m[0].second);
96         assert(m.suffix().second == s+4);
97         assert(m.length(0) == 2);
98         assert(m.position(0) == 1);
99         assert(m.str(0) == "bc");
100     }
101     {
102         std::cmatch m;
103         const char s[] = "abbc";
104         assert(std::regex_search(s, m, std::regex("ab*c", std::regex_constants::awk)));
105         assert(m.size() == 1);
106         assert(!m.prefix().matched);
107         assert(m.prefix().first == s);
108         assert(m.prefix().second == m[0].first);
109         assert(!m.suffix().matched);
110         assert(m.suffix().first == m[0].second);
111         assert(m.suffix().second == s+4);
112         assert(m.length(0) == 4);
113         assert(m.position(0) == 0);
114         assert(m.str(0) == s);
115     }
116     {
117         std::cmatch m;
118         const char s[] = "ababc";
119         assert(std::regex_search(s, m, std::regex("(ab)*c", std::regex_constants::awk)));
120         assert(m.size() == 2);
121         assert(!m.prefix().matched);
122         assert(m.prefix().first == s);
123         assert(m.prefix().second == m[0].first);
124         assert(!m.suffix().matched);
125         assert(m.suffix().first == m[0].second);
126         assert(m.suffix().second == s+5);
127         assert(m.length(0) == 5);
128         assert(m.position(0) == 0);
129         assert(m.str(0) == s);
130         assert(m.length(1) == 2);
131         assert(m.position(1) == 2);
132         assert(m.str(1) == "ab");
133     }
134     {
135         std::cmatch m;
136         const char s[] = "abcdefghijk";
137         assert(std::regex_search(s, m, std::regex("cd((e)fg)hi",
138                                  std::regex_constants::awk)));
139         assert(m.size() == 3);
140         assert(m.prefix().matched);
141         assert(m.prefix().first == s);
142         assert(m.prefix().second == m[0].first);
143         assert(m.suffix().matched);
144         assert(m.suffix().first == m[0].second);
145         assert(m.suffix().second == s+std::regex_traits<char>::length(s));
146         assert(m.length(0) == 7);
147         assert(m.position(0) == 2);
148         assert(m.str(0) == "cdefghi");
149         assert(m.length(1) == 3);
150         assert(m.position(1) == 4);
151         assert(m.str(1) == "efg");
152         assert(m.length(2) == 1);
153         assert(m.position(2) == 4);
154         assert(m.str(2) == "e");
155     }
156     {
157         std::cmatch m;
158         const char s[] = "abc";
159         assert(std::regex_search(s, m, std::regex("^abc", std::regex_constants::awk)));
160         assert(m.size() == 1);
161         assert(!m.prefix().matched);
162         assert(m.prefix().first == s);
163         assert(m.prefix().second == m[0].first);
164         assert(!m.suffix().matched);
165         assert(m.suffix().first == m[0].second);
166         assert(m.suffix().second == s+3);
167         assert(m.length(0) == 3);
168         assert(m.position(0) == 0);
169         assert(m.str(0) == s);
170     }
171     {
172         std::cmatch m;
173         const char s[] = "abcd";
174         assert(std::regex_search(s, m, std::regex("^abc", std::regex_constants::awk)));
175         assert(m.size() == 1);
176         assert(!m.prefix().matched);
177         assert(m.prefix().first == s);
178         assert(m.prefix().second == m[0].first);
179         assert(m.suffix().matched);
180         assert(m.suffix().first == m[0].second);
181         assert(m.suffix().second == s+4);
182         assert(m.length(0) == 3);
183         assert(m.position(0) == 0);
184         assert(m.str(0) == "abc");
185     }
186     {
187         std::cmatch m;
188         const char s[] = "aabc";
189         assert(!std::regex_search(s, m, std::regex("^abc", std::regex_constants::awk)));
190         assert(m.size() == 0);
191     }
192     {
193         std::cmatch m;
194         const char s[] = "abc";
195         assert(std::regex_search(s, m, std::regex("abc$", std::regex_constants::awk)));
196         assert(m.size() == 1);
197         assert(!m.prefix().matched);
198         assert(m.prefix().first == s);
199         assert(m.prefix().second == m[0].first);
200         assert(!m.suffix().matched);
201         assert(m.suffix().first == m[0].second);
202         assert(m.suffix().second == s+3);
203         assert(m.length(0) == 3);
204         assert(m.position(0) == 0);
205         assert(m.str(0) == s);
206     }
207     {
208         std::cmatch m;
209         const char s[] = "efabc";
210         assert(std::regex_search(s, m, std::regex("abc$", std::regex_constants::awk)));
211         assert(m.size() == 1);
212         assert(m.prefix().matched);
213         assert(m.prefix().first == s);
214         assert(m.prefix().second == m[0].first);
215         assert(!m.suffix().matched);
216         assert(m.suffix().first == m[0].second);
217         assert(m.suffix().second == s+5);
218         assert(m.length(0) == 3);
219         assert(m.position(0) == 2);
220         assert(m.str(0) == s+2);
221     }
222     {
223         std::cmatch m;
224         const char s[] = "efabcg";
225         assert(!std::regex_search(s, m, std::regex("abc$", std::regex_constants::awk)));
226         assert(m.size() == 0);
227     }
228     {
229         std::cmatch m;
230         const char s[] = "abc";
231         assert(std::regex_search(s, m, std::regex("a.c", std::regex_constants::awk)));
232         assert(m.size() == 1);
233         assert(!m.prefix().matched);
234         assert(m.prefix().first == s);
235         assert(m.prefix().second == m[0].first);
236         assert(!m.suffix().matched);
237         assert(m.suffix().first == m[0].second);
238         assert(m.suffix().second == s+3);
239         assert(m.length(0) == 3);
240         assert(m.position(0) == 0);
241         assert(m.str(0) == s);
242     }
243     {
244         std::cmatch m;
245         const char s[] = "acc";
246         assert(std::regex_search(s, m, std::regex("a.c", std::regex_constants::awk)));
247         assert(m.size() == 1);
248         assert(!m.prefix().matched);
249         assert(m.prefix().first == s);
250         assert(m.prefix().second == m[0].first);
251         assert(!m.suffix().matched);
252         assert(m.suffix().first == m[0].second);
253         assert(m.suffix().second == s+3);
254         assert(m.length(0) == 3);
255         assert(m.position(0) == 0);
256         assert(m.str(0) == s);
257     }
258     {
259         std::cmatch m;
260         const char s[] = "acc";
261         assert(std::regex_search(s, m, std::regex("a.c", std::regex_constants::awk)));
262         assert(m.size() == 1);
263         assert(!m.prefix().matched);
264         assert(m.prefix().first == s);
265         assert(m.prefix().second == m[0].first);
266         assert(!m.suffix().matched);
267         assert(m.suffix().first == m[0].second);
268         assert(m.suffix().second == s+3);
269         assert(m.length(0) == 3);
270         assert(m.position(0) == 0);
271         assert(m.str(0) == s);
272     }
273     {
274         std::cmatch m;
275         const char s[] = "abcdef";
276         assert(std::regex_search(s, m, std::regex("(.*).*", std::regex_constants::awk)));
277         assert(m.size() == 2);
278         assert(!m.prefix().matched);
279         assert(m.prefix().first == s);
280         assert(m.prefix().second == m[0].first);
281         assert(!m.suffix().matched);
282         assert(m.suffix().first == m[0].second);
283         assert(m.suffix().second == s+6);
284         assert(m.length(0) == 6);
285         assert(m.position(0) == 0);
286         assert(m.str(0) == s);
287         assert(m.length(1) == 6);
288         assert(m.position(1) == 0);
289         assert(m.str(1) == s);
290     }
291     {
292         std::cmatch m;
293         const char s[] = "bc";
294         assert(std::regex_search(s, m, std::regex("(a*)*", std::regex_constants::awk)));
295         assert(m.size() == 2);
296         assert(!m.prefix().matched);
297         assert(m.prefix().first == s);
298         assert(m.prefix().second == m[0].first);
299         assert(m.suffix().matched);
300         assert(m.suffix().first == m[0].second);
301         assert(m.suffix().second == s+2);
302         assert(m.length(0) == 0);
303         assert(m.position(0) == 0);
304         assert(m.str(0) == "");
305         assert(m.length(1) == 0);
306         assert(m.position(1) == 0);
307         assert(m.str(1) == "");
308     }
309     {
310         std::cmatch m;
311         const char s[] = "abbc";
312         assert(!std::regex_search(s, m, std::regex("ab{3,5}c", std::regex_constants::awk)));
313         assert(m.size() == 0);
314     }
315     {
316         std::cmatch m;
317         const char s[] = "abbbc";
318         assert(std::regex_search(s, m, std::regex("ab{3,5}c", std::regex_constants::awk)));
319         assert(m.size() == 1);
320         assert(!m.prefix().matched);
321         assert(m.prefix().first == s);
322         assert(m.prefix().second == m[0].first);
323         assert(!m.suffix().matched);
324         assert(m.suffix().first == m[0].second);
325         assert(m.suffix().second == m[0].second);
326         assert(m.length(0) == std::char_traits<char>::length(s));
327         assert(m.position(0) == 0);
328         assert(m.str(0) == s);
329     }
330     {
331         std::cmatch m;
332         const char s[] = "abbbbc";
333         assert(std::regex_search(s, m, std::regex("ab{3,5}c", std::regex_constants::awk)));
334         assert(m.size() == 1);
335         assert(!m.prefix().matched);
336         assert(m.prefix().first == s);
337         assert(m.prefix().second == m[0].first);
338         assert(!m.suffix().matched);
339         assert(m.suffix().first == m[0].second);
340         assert(m.suffix().second == m[0].second);
341         assert(m.length(0) == std::char_traits<char>::length(s));
342         assert(m.position(0) == 0);
343         assert(m.str(0) == s);
344     }
345     {
346         std::cmatch m;
347         const char s[] = "abbbbbc";
348         assert(std::regex_search(s, m, std::regex("ab{3,5}c", std::regex_constants::awk)));
349         assert(m.size() == 1);
350         assert(!m.prefix().matched);
351         assert(m.prefix().first == s);
352         assert(m.prefix().second == m[0].first);
353         assert(!m.suffix().matched);
354         assert(m.suffix().first == m[0].second);
355         assert(m.suffix().second == m[0].second);
356         assert(m.length(0) == std::char_traits<char>::length(s));
357         assert(m.position(0) == 0);
358         assert(m.str(0) == s);
359     }
360     {
361         std::cmatch m;
362         const char s[] = "adefc";
363         assert(!std::regex_search(s, m, std::regex("ab{3,5}c", std::regex_constants::awk)));
364         assert(m.size() == 0);
365     }
366     {
367         std::cmatch m;
368         const char s[] = "abbbbbbc";
369         assert(!std::regex_search(s, m, std::regex("ab{3,5}c", std::regex_constants::awk)));
370         assert(m.size() == 0);
371     }
372     {
373         std::cmatch m;
374         const char s[] = "adec";
375         assert(!std::regex_search(s, m, std::regex("a.{3,5}c", std::regex_constants::awk)));
376         assert(m.size() == 0);
377     }
378     {
379         std::cmatch m;
380         const char s[] = "adefc";
381         assert(std::regex_search(s, m, std::regex("a.{3,5}c", std::regex_constants::awk)));
382         assert(m.size() == 1);
383         assert(!m.prefix().matched);
384         assert(m.prefix().first == s);
385         assert(m.prefix().second == m[0].first);
386         assert(!m.suffix().matched);
387         assert(m.suffix().first == m[0].second);
388         assert(m.suffix().second == m[0].second);
389         assert(m.length(0) == std::char_traits<char>::length(s));
390         assert(m.position(0) == 0);
391         assert(m.str(0) == s);
392     }
393     {
394         std::cmatch m;
395         const char s[] = "adefgc";
396         assert(std::regex_search(s, m, std::regex("a.{3,5}c", std::regex_constants::awk)));
397         assert(m.size() == 1);
398         assert(!m.prefix().matched);
399         assert(m.prefix().first == s);
400         assert(m.prefix().second == m[0].first);
401         assert(!m.suffix().matched);
402         assert(m.suffix().first == m[0].second);
403         assert(m.suffix().second == m[0].second);
404         assert(m.length(0) == std::char_traits<char>::length(s));
405         assert(m.position(0) == 0);
406         assert(m.str(0) == s);
407     }
408     {
409         std::cmatch m;
410         const char s[] = "adefghc";
411         assert(std::regex_search(s, m, std::regex("a.{3,5}c", std::regex_constants::awk)));
412         assert(m.size() == 1);
413         assert(!m.prefix().matched);
414         assert(m.prefix().first == s);
415         assert(m.prefix().second == m[0].first);
416         assert(!m.suffix().matched);
417         assert(m.suffix().first == m[0].second);
418         assert(m.suffix().second == m[0].second);
419         assert(m.length(0) == std::char_traits<char>::length(s));
420         assert(m.position(0) == 0);
421         assert(m.str(0) == s);
422     }
423     {
424         std::cmatch m;
425         const char s[] = "adefghic";
426         assert(!std::regex_search(s, m, std::regex("a.{3,5}c", std::regex_constants::awk)));
427         assert(m.size() == 0);
428     }
429     {
430         std::cmatch m;
431         const char s[] = "tournament";
432         assert(std::regex_search(s, m, std::regex("tour|to|tournament",
433                                               std::regex_constants::awk)));
434         assert(m.size() == 1);
435         assert(!m.prefix().matched);
436         assert(m.prefix().first == s);
437         assert(m.prefix().second == m[0].first);
438         assert(!m.suffix().matched);
439         assert(m.suffix().first == m[0].second);
440         assert(m.suffix().second == m[0].second);
441         assert(m.length(0) == std::char_traits<char>::length(s));
442         assert(m.position(0) == 0);
443         assert(m.str(0) == s);
444     }
445     {
446         std::cmatch m;
447         const char s[] = "tournamenttotour";
448         assert(std::regex_search(s, m, std::regex("(tour|to|tournament)+",
449                std::regex_constants::awk | std::regex_constants::nosubs)));
450         assert(m.size() == 1);
451         assert(!m.prefix().matched);
452         assert(m.prefix().first == s);
453         assert(m.prefix().second == m[0].first);
454         assert(!m.suffix().matched);
455         assert(m.suffix().first == m[0].second);
456         assert(m.suffix().second == m[0].second);
457         assert(m.length(0) == std::char_traits<char>::length(s));
458         assert(m.position(0) == 0);
459         assert(m.str(0) == s);
460     }
461     {
462         std::cmatch m;
463         const char s[] = "ttotour";
464         assert(std::regex_search(s, m, std::regex("(tour|to|t)+",
465                                               std::regex_constants::awk)));
466         assert(m.size() == 2);
467         assert(!m.prefix().matched);
468         assert(m.prefix().first == s);
469         assert(m.prefix().second == m[0].first);
470         assert(!m.suffix().matched);
471         assert(m.suffix().first == m[0].second);
472         assert(m.suffix().second == m[0].second);
473         assert(m.length(0) == std::char_traits<char>::length(s));
474         assert(m.position(0) == 0);
475         assert(m.str(0) == s);
476         assert(m.length(1) == 4);
477         assert(m.position(1) == 3);
478         assert(m.str(1) == "tour");
479     }
480     {
481         std::cmatch m;
482         const char s[] = "-ab,ab-";
483         assert(!std::regex_search(s, m, std::regex("-(.*),\1-", std::regex_constants::awk)));
484         assert(m.size() == 0);
485     }
486     {
487         std::cmatch m;
488         const char s[] = "-ab,ab-";
489         assert(std::regex_search(s, m, std::regex("-.*,.*-", std::regex_constants::awk)));
490         assert(m.size() == 1);
491         assert(!m.prefix().matched);
492         assert(m.prefix().first == s);
493         assert(m.prefix().second == m[0].first);
494         assert(!m.suffix().matched);
495         assert(m.suffix().first == m[0].second);
496         assert(m.suffix().second == m[0].second);
497         assert(m.length(0) == std::char_traits<char>::length(s));
498         assert(m.position(0) == 0);
499         assert(m.str(0) == s);
500     }
501     {
502         std::cmatch m;
503         const char s[] = "a";
504         assert(std::regex_search(s, m, std::regex("^[a]$",
505                                                  std::regex_constants::awk)));
506         assert(m.size() == 1);
507         assert(!m.prefix().matched);
508         assert(m.prefix().first == s);
509         assert(m.prefix().second == m[0].first);
510         assert(!m.suffix().matched);
511         assert(m.suffix().first == m[0].second);
512         assert(m.suffix().second == m[0].second);
513         assert(m.length(0) == 1);
514         assert(m.position(0) == 0);
515         assert(m.str(0) == "a");
516     }
517     {
518         std::cmatch m;
519         const char s[] = "a";
520         assert(std::regex_search(s, m, std::regex("^[ab]$",
521                                                  std::regex_constants::awk)));
522         assert(m.size() == 1);
523         assert(!m.prefix().matched);
524         assert(m.prefix().first == s);
525         assert(m.prefix().second == m[0].first);
526         assert(!m.suffix().matched);
527         assert(m.suffix().first == m[0].second);
528         assert(m.suffix().second == m[0].second);
529         assert(m.length(0) == 1);
530         assert(m.position(0) == 0);
531         assert(m.str(0) == "a");
532     }
533     {
534         std::cmatch m;
535         const char s[] = "c";
536         assert(std::regex_search(s, m, std::regex("^[a-f]$",
537                                                  std::regex_constants::awk)));
538         assert(m.size() == 1);
539         assert(!m.prefix().matched);
540         assert(m.prefix().first == s);
541         assert(m.prefix().second == m[0].first);
542         assert(!m.suffix().matched);
543         assert(m.suffix().first == m[0].second);
544         assert(m.suffix().second == m[0].second);
545         assert(m.length(0) == 1);
546         assert(m.position(0) == 0);
547         assert(m.str(0) == s);
548     }
549     {
550         std::cmatch m;
551         const char s[] = "g";
552         assert(!std::regex_search(s, m, std::regex("^[a-f]$",
553                                                  std::regex_constants::awk)));
554         assert(m.size() == 0);
555     }
556     {
557         std::cmatch m;
558         const char s[] = "Iraqi";
559         assert(std::regex_search(s, m, std::regex("q[^u]",
560                                                  std::regex_constants::awk)));
561         assert(m.size() == 1);
562         assert(m.prefix().matched);
563         assert(m.prefix().first == s);
564         assert(m.prefix().second == m[0].first);
565         assert(!m.suffix().matched);
566         assert(m.suffix().first == m[0].second);
567         assert(m.suffix().second == m[0].second);
568         assert(m.length(0) == 2);
569         assert(m.position(0) == 3);
570         assert(m.str(0) == "qi");
571     }
572     {
573         std::cmatch m;
574         const char s[] = "Iraq";
575         assert(!std::regex_search(s, m, std::regex("q[^u]",
576                                                  std::regex_constants::awk)));
577         assert(m.size() == 0);
578     }
579     {
580         std::cmatch m;
581         const char s[] = "AmB";
582         assert(std::regex_search(s, m, std::regex("A[[:lower:]]B",
583                                                  std::regex_constants::awk)));
584         assert(m.size() == 1);
585         assert(!m.prefix().matched);
586         assert(m.prefix().first == s);
587         assert(m.prefix().second == m[0].first);
588         assert(!m.suffix().matched);
589         assert(m.suffix().first == m[0].second);
590         assert(m.suffix().second == m[0].second);
591         assert(m.length(0) == std::char_traits<char>::length(s));
592         assert(m.position(0) == 0);
593         assert(m.str(0) == s);
594     }
595     {
596         std::cmatch m;
597         const char s[] = "AMB";
598         assert(!std::regex_search(s, m, std::regex("A[[:lower:]]B",
599                                                  std::regex_constants::awk)));
600         assert(m.size() == 0);
601     }
602     {
603         std::cmatch m;
604         const char s[] = "AMB";
605         assert(std::regex_search(s, m, std::regex("A[^[:lower:]]B",
606                                                  std::regex_constants::awk)));
607         assert(m.size() == 1);
608         assert(!m.prefix().matched);
609         assert(m.prefix().first == s);
610         assert(m.prefix().second == m[0].first);
611         assert(!m.suffix().matched);
612         assert(m.suffix().first == m[0].second);
613         assert(m.suffix().second == m[0].second);
614         assert(m.length(0) == std::char_traits<char>::length(s));
615         assert(m.position(0) == 0);
616         assert(m.str(0) == s);
617     }
618     {
619         std::cmatch m;
620         const char s[] = "AmB";
621         assert(!std::regex_search(s, m, std::regex("A[^[:lower:]]B",
622                                                  std::regex_constants::awk)));
623         assert(m.size() == 0);
624     }
625     {
626         std::cmatch m;
627         const char s[] = "A5B";
628         assert(!std::regex_search(s, m, std::regex("A[^[:lower:]0-9]B",
629                                                  std::regex_constants::awk)));
630         assert(m.size() == 0);
631     }
632     {
633         std::cmatch m;
634         const char s[] = "A?B";
635         assert(std::regex_search(s, m, std::regex("A[^[:lower:]0-9]B",
636                                                  std::regex_constants::awk)));
637         assert(m.size() == 1);
638         assert(!m.prefix().matched);
639         assert(m.prefix().first == s);
640         assert(m.prefix().second == m[0].first);
641         assert(!m.suffix().matched);
642         assert(m.suffix().first == m[0].second);
643         assert(m.suffix().second == m[0].second);
644         assert(m.length(0) == std::char_traits<char>::length(s));
645         assert(m.position(0) == 0);
646         assert(m.str(0) == s);
647     }
648     {
649         std::cmatch m;
650         const char s[] = "-";
651         assert(std::regex_search(s, m, std::regex("[a[.hyphen.]z]",
652                                                  std::regex_constants::awk)));
653         assert(m.size() == 1);
654         assert(!m.prefix().matched);
655         assert(m.prefix().first == s);
656         assert(m.prefix().second == m[0].first);
657         assert(!m.suffix().matched);
658         assert(m.suffix().first == m[0].second);
659         assert(m.suffix().second == m[0].second);
660         assert(m.length(0) == std::char_traits<char>::length(s));
661         assert(m.position(0) == 0);
662         assert(m.str(0) == s);
663     }
664     {
665         std::cmatch m;
666         const char s[] = "z";
667         assert(std::regex_search(s, m, std::regex("[a[.hyphen.]z]",
668                                                  std::regex_constants::awk)));
669         assert(m.size() == 1);
670         assert(!m.prefix().matched);
671         assert(m.prefix().first == s);
672         assert(m.prefix().second == m[0].first);
673         assert(!m.suffix().matched);
674         assert(m.suffix().first == m[0].second);
675         assert(m.suffix().second == m[0].second);
676         assert(m.length(0) == std::char_traits<char>::length(s));
677         assert(m.position(0) == 0);
678         assert(m.str(0) == s);
679     }
680     {
681         std::cmatch m;
682         const char s[] = "m";
683         assert(!std::regex_search(s, m, std::regex("[a[.hyphen.]z]",
684                                                  std::regex_constants::awk)));
685         assert(m.size() == 0);
686     }
687     std::locale::global(std::locale("cs_CZ.ISO8859-2"));
688     {
689         std::cmatch m;
690         const char s[] = "m";
691         assert(std::regex_search(s, m, std::regex("[a[=M=]z]",
692                                                  std::regex_constants::awk)));
693         assert(m.size() == 1);
694         assert(!m.prefix().matched);
695         assert(m.prefix().first == s);
696         assert(m.prefix().second == m[0].first);
697         assert(!m.suffix().matched);
698         assert(m.suffix().first == m[0].second);
699         assert(m.suffix().second == m[0].second);
700         assert(m.length(0) == std::char_traits<char>::length(s));
701         assert(m.position(0) == 0);
702         assert(m.str(0) == s);
703     }
704     {
705         std::cmatch m;
706         const char s[] = "Ch";
707         assert(std::regex_search(s, m, std::regex("[a[.ch.]z]",
708                    std::regex_constants::awk | std::regex_constants::icase)));
709         assert(m.size() == 1);
710         assert(!m.prefix().matched);
711         assert(m.prefix().first == s);
712         assert(m.prefix().second == m[0].first);
713         assert(!m.suffix().matched);
714         assert(m.suffix().first == m[0].second);
715         assert(m.suffix().second == m[0].second);
716         assert(m.length(0) == std::char_traits<char>::length(s));
717         assert(m.position(0) == 0);
718         assert(m.str(0) == s);
719     }
720     std::locale::global(std::locale("C"));
721     {
722         std::cmatch m;
723         const char s[] = "m";
724         assert(!std::regex_search(s, m, std::regex("[a[=M=]z]",
725                                                  std::regex_constants::awk)));
726         assert(m.size() == 0);
727     }
728     {
729         std::cmatch m;
730         const char s[] = "01a45cef9";
731         assert(std::regex_search(s, m, std::regex("[ace1-9]*",
732                                                  std::regex_constants::awk)));
733         assert(m.size() == 1);
734         assert(!m.prefix().matched);
735         assert(m.prefix().first == s);
736         assert(m.prefix().second == m[0].first);
737         assert(m.suffix().matched);
738         assert(m.suffix().first == m[0].second);
739         assert(m.suffix().second == s + std::char_traits<char>::length(s));
740         assert(m.length(0) == 0);
741         assert(m.position(0) == 0);
742         assert(m.str(0) == "");
743     }
744     {
745         std::cmatch m;
746         const char s[] = "01a45cef9";
747         assert(std::regex_search(s, m, std::regex("[ace1-9]+",
748                                                  std::regex_constants::awk)));
749         assert(m.size() == 1);
750         assert(m.prefix().matched);
751         assert(m.prefix().first == s);
752         assert(m.prefix().second == m[0].first);
753         assert(m.suffix().matched);
754         assert(m.suffix().first == m[0].second);
755         assert(m.suffix().second == s + std::char_traits<char>::length(s));
756         assert(m.length(0) == 6);
757         assert(m.position(0) == 1);
758         assert(m.str(0) == "1a45ce");
759     }
760     {
761         const char r[] = "^[-+]?[0-9]+[CF]$";
762         std::ptrdiff_t sr = std::char_traits<char>::length(r);
763         typedef forward_iterator<const char*> FI;
764         typedef bidirectional_iterator<const char*> BI;
765         std::regex regex(FI(r), FI(r+sr), std::regex_constants::awk);
766         std::match_results<BI> m;
767         const char s[] = "-40C";
768         std::ptrdiff_t ss = std::char_traits<char>::length(s);
769         assert(std::regex_search(BI(s), BI(s+ss), m, regex));
770         assert(m.size() == 1);
771         assert(!m.prefix().matched);
772         assert(m.prefix().first == BI(s));
773         assert(m.prefix().second == m[0].first);
774         assert(!m.suffix().matched);
775         assert(m.suffix().first == m[0].second);
776         assert(m.suffix().second == m[0].second);
777         assert(m.length(0) == 4);
778         assert(m.position(0) == 0);
779         assert(m.str(0) == s);
780     }
781     {
782         std::cmatch m;
783         const char s[] = "\n\n\n";
784         assert(std::regex_search(s, m, std::regex("[\\n]+",
785                                                  std::regex_constants::awk)));
786         assert(m.size() == 1);
787         assert(!m.prefix().matched);
788         assert(m.prefix().first == s);
789         assert(m.prefix().second == m[0].first);
790         assert(!m.suffix().matched);
791         assert(m.suffix().first == m[0].second);
792         assert(m.suffix().second == s + std::char_traits<char>::length(s));
793         assert(m.length(0) == std::char_traits<char>::length(s));
794         assert(m.position(0) == 0);
795         assert(m.str(0) == s);
796     }
797     {
798         std::wcmatch m;
799         const wchar_t s[] = L"a";
800         assert(std::regex_search(s, m, std::wregex(L"a", std::regex_constants::awk)));
801         assert(m.size() == 1);
802         assert(!m.empty());
803         assert(!m.prefix().matched);
804         assert(m.prefix().first == s);
805         assert(m.prefix().second == m[0].first);
806         assert(!m.suffix().matched);
807         assert(m.suffix().first == m[0].second);
808         assert(m.suffix().second == s+1);
809         assert(m.length(0) == 1);
810         assert(m.position(0) == 0);
811         assert(m.str(0) == L"a");
812     }
813     {
814         std::wcmatch m;
815         const wchar_t s[] = L"ab";
816         assert(std::regex_search(s, m, std::wregex(L"ab", std::regex_constants::awk)));
817         assert(m.size() == 1);
818         assert(!m.prefix().matched);
819         assert(m.prefix().first == s);
820         assert(m.prefix().second == m[0].first);
821         assert(!m.suffix().matched);
822         assert(m.suffix().first == m[0].second);
823         assert(m.suffix().second == s+2);
824         assert(m.length(0) == 2);
825         assert(m.position(0) == 0);
826         assert(m.str(0) == L"ab");
827     }
828     {
829         std::wcmatch m;
830         const wchar_t s[] = L"ab";
831         assert(!std::regex_search(s, m, std::wregex(L"ba", std::regex_constants::awk)));
832         assert(m.size() == 0);
833         assert(m.empty());
834     }
835     {
836         std::wcmatch m;
837         const wchar_t s[] = L"aab";
838         assert(std::regex_search(s, m, std::wregex(L"ab", std::regex_constants::awk)));
839         assert(m.size() == 1);
840         assert(m.prefix().matched);
841         assert(m.prefix().first == s);
842         assert(m.prefix().second == m[0].first);
843         assert(!m.suffix().matched);
844         assert(m.suffix().first == m[0].second);
845         assert(m.suffix().second == s+3);
846         assert(m.length(0) == 2);
847         assert(m.position(0) == 1);
848         assert(m.str(0) == L"ab");
849     }
850     {
851         std::wcmatch m;
852         const wchar_t s[] = L"aab";
853         assert(!std::regex_search(s, m, std::wregex(L"ab", std::regex_constants::awk),
854                                             std::regex_constants::match_continuous));
855         assert(m.size() == 0);
856     }
857     {
858         std::wcmatch m;
859         const wchar_t s[] = L"abcd";
860         assert(std::regex_search(s, m, std::wregex(L"bc", std::regex_constants::awk)));
861         assert(m.size() == 1);
862         assert(m.prefix().matched);
863         assert(m.prefix().first == s);
864         assert(m.prefix().second == m[0].first);
865         assert(m.suffix().matched);
866         assert(m.suffix().first == m[0].second);
867         assert(m.suffix().second == s+4);
868         assert(m.length(0) == 2);
869         assert(m.position(0) == 1);
870         assert(m.str(0) == L"bc");
871     }
872     {
873         std::wcmatch m;
874         const wchar_t s[] = L"abbc";
875         assert(std::regex_search(s, m, std::wregex(L"ab*c", std::regex_constants::awk)));
876         assert(m.size() == 1);
877         assert(!m.prefix().matched);
878         assert(m.prefix().first == s);
879         assert(m.prefix().second == m[0].first);
880         assert(!m.suffix().matched);
881         assert(m.suffix().first == m[0].second);
882         assert(m.suffix().second == s+4);
883         assert(m.length(0) == 4);
884         assert(m.position(0) == 0);
885         assert(m.str(0) == s);
886     }
887     {
888         std::wcmatch m;
889         const wchar_t s[] = L"ababc";
890         assert(std::regex_search(s, m, std::wregex(L"(ab)*c", std::regex_constants::awk)));
891         assert(m.size() == 2);
892         assert(!m.prefix().matched);
893         assert(m.prefix().first == s);
894         assert(m.prefix().second == m[0].first);
895         assert(!m.suffix().matched);
896         assert(m.suffix().first == m[0].second);
897         assert(m.suffix().second == s+5);
898         assert(m.length(0) == 5);
899         assert(m.position(0) == 0);
900         assert(m.str(0) == s);
901         assert(m.length(1) == 2);
902         assert(m.position(1) == 2);
903         assert(m.str(1) == L"ab");
904     }
905     {
906         std::wcmatch m;
907         const wchar_t s[] = L"abcdefghijk";
908         assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi",
909                                  std::regex_constants::awk)));
910         assert(m.size() == 3);
911         assert(m.prefix().matched);
912         assert(m.prefix().first == s);
913         assert(m.prefix().second == m[0].first);
914         assert(m.suffix().matched);
915         assert(m.suffix().first == m[0].second);
916         assert(m.suffix().second == s+std::regex_traits<wchar_t>::length(s));
917         assert(m.length(0) == 7);
918         assert(m.position(0) == 2);
919         assert(m.str(0) == L"cdefghi");
920         assert(m.length(1) == 3);
921         assert(m.position(1) == 4);
922         assert(m.str(1) == L"efg");
923         assert(m.length(2) == 1);
924         assert(m.position(2) == 4);
925         assert(m.str(2) == L"e");
926     }
927     {
928         std::wcmatch m;
929         const wchar_t s[] = L"abc";
930         assert(std::regex_search(s, m, std::wregex(L"^abc", std::regex_constants::awk)));
931         assert(m.size() == 1);
932         assert(!m.prefix().matched);
933         assert(m.prefix().first == s);
934         assert(m.prefix().second == m[0].first);
935         assert(!m.suffix().matched);
936         assert(m.suffix().first == m[0].second);
937         assert(m.suffix().second == s+3);
938         assert(m.length(0) == 3);
939         assert(m.position(0) == 0);
940         assert(m.str(0) == s);
941     }
942     {
943         std::wcmatch m;
944         const wchar_t s[] = L"abcd";
945         assert(std::regex_search(s, m, std::wregex(L"^abc", std::regex_constants::awk)));
946         assert(m.size() == 1);
947         assert(!m.prefix().matched);
948         assert(m.prefix().first == s);
949         assert(m.prefix().second == m[0].first);
950         assert(m.suffix().matched);
951         assert(m.suffix().first == m[0].second);
952         assert(m.suffix().second == s+4);
953         assert(m.length(0) == 3);
954         assert(m.position(0) == 0);
955         assert(m.str(0) == L"abc");
956     }
957     {
958         std::wcmatch m;
959         const wchar_t s[] = L"aabc";
960         assert(!std::regex_search(s, m, std::wregex(L"^abc", std::regex_constants::awk)));
961         assert(m.size() == 0);
962     }
963     {
964         std::wcmatch m;
965         const wchar_t s[] = L"abc";
966         assert(std::regex_search(s, m, std::wregex(L"abc$", std::regex_constants::awk)));
967         assert(m.size() == 1);
968         assert(!m.prefix().matched);
969         assert(m.prefix().first == s);
970         assert(m.prefix().second == m[0].first);
971         assert(!m.suffix().matched);
972         assert(m.suffix().first == m[0].second);
973         assert(m.suffix().second == s+3);
974         assert(m.length(0) == 3);
975         assert(m.position(0) == 0);
976         assert(m.str(0) == s);
977     }
978     {
979         std::wcmatch m;
980         const wchar_t s[] = L"efabc";
981         assert(std::regex_search(s, m, std::wregex(L"abc$", std::regex_constants::awk)));
982         assert(m.size() == 1);
983         assert(m.prefix().matched);
984         assert(m.prefix().first == s);
985         assert(m.prefix().second == m[0].first);
986         assert(!m.suffix().matched);
987         assert(m.suffix().first == m[0].second);
988         assert(m.suffix().second == s+5);
989         assert(m.length(0) == 3);
990         assert(m.position(0) == 2);
991         assert(m.str(0) == s+2);
992     }
993     {
994         std::wcmatch m;
995         const wchar_t s[] = L"efabcg";
996         assert(!std::regex_search(s, m, std::wregex(L"abc$", std::regex_constants::awk)));
997         assert(m.size() == 0);
998     }
999     {
1000         std::wcmatch m;
1001         const wchar_t s[] = L"abc";
1002         assert(std::regex_search(s, m, std::wregex(L"a.c", std::regex_constants::awk)));
1003         assert(m.size() == 1);
1004         assert(!m.prefix().matched);
1005         assert(m.prefix().first == s);
1006         assert(m.prefix().second == m[0].first);
1007         assert(!m.suffix().matched);
1008         assert(m.suffix().first == m[0].second);
1009         assert(m.suffix().second == s+3);
1010         assert(m.length(0) == 3);
1011         assert(m.position(0) == 0);
1012         assert(m.str(0) == s);
1013     }
1014     {
1015         std::wcmatch m;
1016         const wchar_t s[] = L"acc";
1017         assert(std::regex_search(s, m, std::wregex(L"a.c", std::regex_constants::awk)));
1018         assert(m.size() == 1);
1019         assert(!m.prefix().matched);
1020         assert(m.prefix().first == s);
1021         assert(m.prefix().second == m[0].first);
1022         assert(!m.suffix().matched);
1023         assert(m.suffix().first == m[0].second);
1024         assert(m.suffix().second == s+3);
1025         assert(m.length(0) == 3);
1026         assert(m.position(0) == 0);
1027         assert(m.str(0) == s);
1028     }
1029     {
1030         std::wcmatch m;
1031         const wchar_t s[] = L"acc";
1032         assert(std::regex_search(s, m, std::wregex(L"a.c", std::regex_constants::awk)));
1033         assert(m.size() == 1);
1034         assert(!m.prefix().matched);
1035         assert(m.prefix().first == s);
1036         assert(m.prefix().second == m[0].first);
1037         assert(!m.suffix().matched);
1038         assert(m.suffix().first == m[0].second);
1039         assert(m.suffix().second == s+3);
1040         assert(m.length(0) == 3);
1041         assert(m.position(0) == 0);
1042         assert(m.str(0) == s);
1043     }
1044     {
1045         std::wcmatch m;
1046         const wchar_t s[] = L"abcdef";
1047         assert(std::regex_search(s, m, std::wregex(L"(.*).*", std::regex_constants::awk)));
1048         assert(m.size() == 2);
1049         assert(!m.prefix().matched);
1050         assert(m.prefix().first == s);
1051         assert(m.prefix().second == m[0].first);
1052         assert(!m.suffix().matched);
1053         assert(m.suffix().first == m[0].second);
1054         assert(m.suffix().second == s+6);
1055         assert(m.length(0) == 6);
1056         assert(m.position(0) == 0);
1057         assert(m.str(0) == s);
1058         assert(m.length(1) == 6);
1059         assert(m.position(1) == 0);
1060         assert(m.str(1) == s);
1061     }
1062     {
1063         std::wcmatch m;
1064         const wchar_t s[] = L"bc";
1065         assert(std::regex_search(s, m, std::wregex(L"(a*)*", std::regex_constants::awk)));
1066         assert(m.size() == 2);
1067         assert(!m.prefix().matched);
1068         assert(m.prefix().first == s);
1069         assert(m.prefix().second == m[0].first);
1070         assert(m.suffix().matched);
1071         assert(m.suffix().first == m[0].second);
1072         assert(m.suffix().second == s+2);
1073         assert(m.length(0) == 0);
1074         assert(m.position(0) == 0);
1075         assert(m.str(0) == L"");
1076         assert(m.length(1) == 0);
1077         assert(m.position(1) == 0);
1078         assert(m.str(1) == L"");
1079     }
1080     {
1081         std::wcmatch m;
1082         const wchar_t s[] = L"abbc";
1083         assert(!std::regex_search(s, m, std::wregex(L"ab{3,5}c", std::regex_constants::awk)));
1084         assert(m.size() == 0);
1085     }
1086     {
1087         std::wcmatch m;
1088         const wchar_t s[] = L"abbbc";
1089         assert(std::regex_search(s, m, std::wregex(L"ab{3,5}c", std::regex_constants::awk)));
1090         assert(m.size() == 1);
1091         assert(!m.prefix().matched);
1092         assert(m.prefix().first == s);
1093         assert(m.prefix().second == m[0].first);
1094         assert(!m.suffix().matched);
1095         assert(m.suffix().first == m[0].second);
1096         assert(m.suffix().second == m[0].second);
1097         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1098         assert(m.position(0) == 0);
1099         assert(m.str(0) == s);
1100     }
1101     {
1102         std::wcmatch m;
1103         const wchar_t s[] = L"abbbbc";
1104         assert(std::regex_search(s, m, std::wregex(L"ab{3,5}c", std::regex_constants::awk)));
1105         assert(m.size() == 1);
1106         assert(!m.prefix().matched);
1107         assert(m.prefix().first == s);
1108         assert(m.prefix().second == m[0].first);
1109         assert(!m.suffix().matched);
1110         assert(m.suffix().first == m[0].second);
1111         assert(m.suffix().second == m[0].second);
1112         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1113         assert(m.position(0) == 0);
1114         assert(m.str(0) == s);
1115     }
1116     {
1117         std::wcmatch m;
1118         const wchar_t s[] = L"abbbbbc";
1119         assert(std::regex_search(s, m, std::wregex(L"ab{3,5}c", std::regex_constants::awk)));
1120         assert(m.size() == 1);
1121         assert(!m.prefix().matched);
1122         assert(m.prefix().first == s);
1123         assert(m.prefix().second == m[0].first);
1124         assert(!m.suffix().matched);
1125         assert(m.suffix().first == m[0].second);
1126         assert(m.suffix().second == m[0].second);
1127         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1128         assert(m.position(0) == 0);
1129         assert(m.str(0) == s);
1130     }
1131     {
1132         std::wcmatch m;
1133         const wchar_t s[] = L"adefc";
1134         assert(!std::regex_search(s, m, std::wregex(L"ab{3,5}c", std::regex_constants::awk)));
1135         assert(m.size() == 0);
1136     }
1137     {
1138         std::wcmatch m;
1139         const wchar_t s[] = L"abbbbbbc";
1140         assert(!std::regex_search(s, m, std::wregex(L"ab{3,5}c", std::regex_constants::awk)));
1141         assert(m.size() == 0);
1142     }
1143     {
1144         std::wcmatch m;
1145         const wchar_t s[] = L"adec";
1146         assert(!std::regex_search(s, m, std::wregex(L"a.{3,5}c", std::regex_constants::awk)));
1147         assert(m.size() == 0);
1148     }
1149     {
1150         std::wcmatch m;
1151         const wchar_t s[] = L"adefc";
1152         assert(std::regex_search(s, m, std::wregex(L"a.{3,5}c", std::regex_constants::awk)));
1153         assert(m.size() == 1);
1154         assert(!m.prefix().matched);
1155         assert(m.prefix().first == s);
1156         assert(m.prefix().second == m[0].first);
1157         assert(!m.suffix().matched);
1158         assert(m.suffix().first == m[0].second);
1159         assert(m.suffix().second == m[0].second);
1160         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1161         assert(m.position(0) == 0);
1162         assert(m.str(0) == s);
1163     }
1164     {
1165         std::wcmatch m;
1166         const wchar_t s[] = L"adefgc";
1167         assert(std::regex_search(s, m, std::wregex(L"a.{3,5}c", std::regex_constants::awk)));
1168         assert(m.size() == 1);
1169         assert(!m.prefix().matched);
1170         assert(m.prefix().first == s);
1171         assert(m.prefix().second == m[0].first);
1172         assert(!m.suffix().matched);
1173         assert(m.suffix().first == m[0].second);
1174         assert(m.suffix().second == m[0].second);
1175         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1176         assert(m.position(0) == 0);
1177         assert(m.str(0) == s);
1178     }
1179     {
1180         std::wcmatch m;
1181         const wchar_t s[] = L"adefghc";
1182         assert(std::regex_search(s, m, std::wregex(L"a.{3,5}c", std::regex_constants::awk)));
1183         assert(m.size() == 1);
1184         assert(!m.prefix().matched);
1185         assert(m.prefix().first == s);
1186         assert(m.prefix().second == m[0].first);
1187         assert(!m.suffix().matched);
1188         assert(m.suffix().first == m[0].second);
1189         assert(m.suffix().second == m[0].second);
1190         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1191         assert(m.position(0) == 0);
1192         assert(m.str(0) == s);
1193     }
1194     {
1195         std::wcmatch m;
1196         const wchar_t s[] = L"adefghic";
1197         assert(!std::regex_search(s, m, std::wregex(L"a.{3,5}c", std::regex_constants::awk)));
1198         assert(m.size() == 0);
1199     }
1200     {
1201         std::wcmatch m;
1202         const wchar_t s[] = L"tournament";
1203         assert(std::regex_search(s, m, std::wregex(L"tour|to|tournament",
1204                                               std::regex_constants::awk)));
1205         assert(m.size() == 1);
1206         assert(!m.prefix().matched);
1207         assert(m.prefix().first == s);
1208         assert(m.prefix().second == m[0].first);
1209         assert(!m.suffix().matched);
1210         assert(m.suffix().first == m[0].second);
1211         assert(m.suffix().second == m[0].second);
1212         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1213         assert(m.position(0) == 0);
1214         assert(m.str(0) == s);
1215     }
1216     {
1217         std::wcmatch m;
1218         const wchar_t s[] = L"tournamenttotour";
1219         assert(std::regex_search(s, m, std::wregex(L"(tour|to|tournament)+",
1220                std::regex_constants::awk | std::regex_constants::nosubs)));
1221         assert(m.size() == 1);
1222         assert(!m.prefix().matched);
1223         assert(m.prefix().first == s);
1224         assert(m.prefix().second == m[0].first);
1225         assert(!m.suffix().matched);
1226         assert(m.suffix().first == m[0].second);
1227         assert(m.suffix().second == m[0].second);
1228         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1229         assert(m.position(0) == 0);
1230         assert(m.str(0) == s);
1231     }
1232     {
1233         std::wcmatch m;
1234         const wchar_t s[] = L"ttotour";
1235         assert(std::regex_search(s, m, std::wregex(L"(tour|to|t)+",
1236                                               std::regex_constants::awk)));
1237         assert(m.size() == 2);
1238         assert(!m.prefix().matched);
1239         assert(m.prefix().first == s);
1240         assert(m.prefix().second == m[0].first);
1241         assert(!m.suffix().matched);
1242         assert(m.suffix().first == m[0].second);
1243         assert(m.suffix().second == m[0].second);
1244         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1245         assert(m.position(0) == 0);
1246         assert(m.str(0) == s);
1247         assert(m.length(1) == 4);
1248         assert(m.position(1) == 3);
1249         assert(m.str(1) == L"tour");
1250     }
1251     {
1252         std::wcmatch m;
1253         const wchar_t s[] = L"-ab,ab-";
1254         assert(!std::regex_search(s, m, std::wregex(L"-(.*),\1-", std::regex_constants::awk)));
1255         assert(m.size() == 0);
1256     }
1257     {
1258         std::wcmatch m;
1259         const wchar_t s[] = L"-ab,ab-";
1260         assert(std::regex_search(s, m, std::wregex(L"-.*,.*-", std::regex_constants::awk)));
1261         assert(m.size() == 1);
1262         assert(!m.prefix().matched);
1263         assert(m.prefix().first == s);
1264         assert(m.prefix().second == m[0].first);
1265         assert(!m.suffix().matched);
1266         assert(m.suffix().first == m[0].second);
1267         assert(m.suffix().second == m[0].second);
1268         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1269         assert(m.position(0) == 0);
1270         assert(m.str(0) == s);
1271     }
1272     {
1273         std::wcmatch m;
1274         const wchar_t s[] = L"a";
1275         assert(std::regex_search(s, m, std::wregex(L"^[a]$",
1276                                                  std::regex_constants::awk)));
1277         assert(m.size() == 1);
1278         assert(!m.prefix().matched);
1279         assert(m.prefix().first == s);
1280         assert(m.prefix().second == m[0].first);
1281         assert(!m.suffix().matched);
1282         assert(m.suffix().first == m[0].second);
1283         assert(m.suffix().second == m[0].second);
1284         assert(m.length(0) == 1);
1285         assert(m.position(0) == 0);
1286         assert(m.str(0) == L"a");
1287     }
1288     {
1289         std::wcmatch m;
1290         const wchar_t s[] = L"a";
1291         assert(std::regex_search(s, m, std::wregex(L"^[ab]$",
1292                                                  std::regex_constants::awk)));
1293         assert(m.size() == 1);
1294         assert(!m.prefix().matched);
1295         assert(m.prefix().first == s);
1296         assert(m.prefix().second == m[0].first);
1297         assert(!m.suffix().matched);
1298         assert(m.suffix().first == m[0].second);
1299         assert(m.suffix().second == m[0].second);
1300         assert(m.length(0) == 1);
1301         assert(m.position(0) == 0);
1302         assert(m.str(0) == L"a");
1303     }
1304     {
1305         std::wcmatch m;
1306         const wchar_t s[] = L"c";
1307         assert(std::regex_search(s, m, std::wregex(L"^[a-f]$",
1308                                                  std::regex_constants::awk)));
1309         assert(m.size() == 1);
1310         assert(!m.prefix().matched);
1311         assert(m.prefix().first == s);
1312         assert(m.prefix().second == m[0].first);
1313         assert(!m.suffix().matched);
1314         assert(m.suffix().first == m[0].second);
1315         assert(m.suffix().second == m[0].second);
1316         assert(m.length(0) == 1);
1317         assert(m.position(0) == 0);
1318         assert(m.str(0) == s);
1319     }
1320     {
1321         std::wcmatch m;
1322         const wchar_t s[] = L"g";
1323         assert(!std::regex_search(s, m, std::wregex(L"^[a-f]$",
1324                                                  std::regex_constants::awk)));
1325         assert(m.size() == 0);
1326     }
1327     {
1328         std::wcmatch m;
1329         const wchar_t s[] = L"Iraqi";
1330         assert(std::regex_search(s, m, std::wregex(L"q[^u]",
1331                                                  std::regex_constants::awk)));
1332         assert(m.size() == 1);
1333         assert(m.prefix().matched);
1334         assert(m.prefix().first == s);
1335         assert(m.prefix().second == m[0].first);
1336         assert(!m.suffix().matched);
1337         assert(m.suffix().first == m[0].second);
1338         assert(m.suffix().second == m[0].second);
1339         assert(m.length(0) == 2);
1340         assert(m.position(0) == 3);
1341         assert(m.str(0) == L"qi");
1342     }
1343     {
1344         std::wcmatch m;
1345         const wchar_t s[] = L"Iraq";
1346         assert(!std::regex_search(s, m, std::wregex(L"q[^u]",
1347                                                  std::regex_constants::awk)));
1348         assert(m.size() == 0);
1349     }
1350     {
1351         std::wcmatch m;
1352         const wchar_t s[] = L"AmB";
1353         assert(std::regex_search(s, m, std::wregex(L"A[[:lower:]]B",
1354                                                  std::regex_constants::awk)));
1355         assert(m.size() == 1);
1356         assert(!m.prefix().matched);
1357         assert(m.prefix().first == s);
1358         assert(m.prefix().second == m[0].first);
1359         assert(!m.suffix().matched);
1360         assert(m.suffix().first == m[0].second);
1361         assert(m.suffix().second == m[0].second);
1362         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1363         assert(m.position(0) == 0);
1364         assert(m.str(0) == s);
1365     }
1366     {
1367         std::wcmatch m;
1368         const wchar_t s[] = L"AMB";
1369         assert(!std::regex_search(s, m, std::wregex(L"A[[:lower:]]B",
1370                                                  std::regex_constants::awk)));
1371         assert(m.size() == 0);
1372     }
1373     {
1374         std::wcmatch m;
1375         const wchar_t s[] = L"AMB";
1376         assert(std::regex_search(s, m, std::wregex(L"A[^[:lower:]]B",
1377                                                  std::regex_constants::awk)));
1378         assert(m.size() == 1);
1379         assert(!m.prefix().matched);
1380         assert(m.prefix().first == s);
1381         assert(m.prefix().second == m[0].first);
1382         assert(!m.suffix().matched);
1383         assert(m.suffix().first == m[0].second);
1384         assert(m.suffix().second == m[0].second);
1385         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1386         assert(m.position(0) == 0);
1387         assert(m.str(0) == s);
1388     }
1389     {
1390         std::wcmatch m;
1391         const wchar_t s[] = L"AmB";
1392         assert(!std::regex_search(s, m, std::wregex(L"A[^[:lower:]]B",
1393                                                  std::regex_constants::awk)));
1394         assert(m.size() == 0);
1395     }
1396     {
1397         std::wcmatch m;
1398         const wchar_t s[] = L"A5B";
1399         assert(!std::regex_search(s, m, std::wregex(L"A[^[:lower:]0-9]B",
1400                                                  std::regex_constants::awk)));
1401         assert(m.size() == 0);
1402     }
1403     {
1404         std::wcmatch m;
1405         const wchar_t s[] = L"A?B";
1406         assert(std::regex_search(s, m, std::wregex(L"A[^[:lower:]0-9]B",
1407                                                  std::regex_constants::awk)));
1408         assert(m.size() == 1);
1409         assert(!m.prefix().matched);
1410         assert(m.prefix().first == s);
1411         assert(m.prefix().second == m[0].first);
1412         assert(!m.suffix().matched);
1413         assert(m.suffix().first == m[0].second);
1414         assert(m.suffix().second == m[0].second);
1415         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1416         assert(m.position(0) == 0);
1417         assert(m.str(0) == s);
1418     }
1419     {
1420         std::wcmatch m;
1421         const wchar_t s[] = L"-";
1422         assert(std::regex_search(s, m, std::wregex(L"[a[.hyphen.]z]",
1423                                                  std::regex_constants::awk)));
1424         assert(m.size() == 1);
1425         assert(!m.prefix().matched);
1426         assert(m.prefix().first == s);
1427         assert(m.prefix().second == m[0].first);
1428         assert(!m.suffix().matched);
1429         assert(m.suffix().first == m[0].second);
1430         assert(m.suffix().second == m[0].second);
1431         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1432         assert(m.position(0) == 0);
1433         assert(m.str(0) == s);
1434     }
1435     {
1436         std::wcmatch m;
1437         const wchar_t s[] = L"z";
1438         assert(std::regex_search(s, m, std::wregex(L"[a[.hyphen.]z]",
1439                                                  std::regex_constants::awk)));
1440         assert(m.size() == 1);
1441         assert(!m.prefix().matched);
1442         assert(m.prefix().first == s);
1443         assert(m.prefix().second == m[0].first);
1444         assert(!m.suffix().matched);
1445         assert(m.suffix().first == m[0].second);
1446         assert(m.suffix().second == m[0].second);
1447         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1448         assert(m.position(0) == 0);
1449         assert(m.str(0) == s);
1450     }
1451     {
1452         std::wcmatch m;
1453         const wchar_t s[] = L"m";
1454         assert(!std::regex_search(s, m, std::wregex(L"[a[.hyphen.]z]",
1455                                                  std::regex_constants::awk)));
1456         assert(m.size() == 0);
1457     }
1458     std::locale::global(std::locale("cs_CZ.ISO8859-2"));
1459     {
1460         std::wcmatch m;
1461         const wchar_t s[] = L"m";
1462         assert(std::regex_search(s, m, std::wregex(L"[a[=M=]z]",
1463                                                  std::regex_constants::awk)));
1464         assert(m.size() == 1);
1465         assert(!m.prefix().matched);
1466         assert(m.prefix().first == s);
1467         assert(m.prefix().second == m[0].first);
1468         assert(!m.suffix().matched);
1469         assert(m.suffix().first == m[0].second);
1470         assert(m.suffix().second == m[0].second);
1471         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1472         assert(m.position(0) == 0);
1473         assert(m.str(0) == s);
1474     }
1475     {
1476         std::wcmatch m;
1477         const wchar_t s[] = L"Ch";
1478         assert(std::regex_search(s, m, std::wregex(L"[a[.ch.]z]",
1479                    std::regex_constants::awk | std::regex_constants::icase)));
1480         assert(m.size() == 1);
1481         assert(!m.prefix().matched);
1482         assert(m.prefix().first == s);
1483         assert(m.prefix().second == m[0].first);
1484         assert(!m.suffix().matched);
1485         assert(m.suffix().first == m[0].second);
1486         assert(m.suffix().second == m[0].second);
1487         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1488         assert(m.position(0) == 0);
1489         assert(m.str(0) == s);
1490     }
1491     std::locale::global(std::locale("C"));
1492     {
1493         std::wcmatch m;
1494         const wchar_t s[] = L"m";
1495         assert(!std::regex_search(s, m, std::wregex(L"[a[=M=]z]",
1496                                                  std::regex_constants::awk)));
1497         assert(m.size() == 0);
1498     }
1499     {
1500         std::wcmatch m;
1501         const wchar_t s[] = L"01a45cef9";
1502         assert(std::regex_search(s, m, std::wregex(L"[ace1-9]*",
1503                                                  std::regex_constants::awk)));
1504         assert(m.size() == 1);
1505         assert(!m.prefix().matched);
1506         assert(m.prefix().first == s);
1507         assert(m.prefix().second == m[0].first);
1508         assert(m.suffix().matched);
1509         assert(m.suffix().first == m[0].second);
1510         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
1511         assert(m.length(0) == 0);
1512         assert(m.position(0) == 0);
1513         assert(m.str(0) == L"");
1514     }
1515     {
1516         std::wcmatch m;
1517         const wchar_t s[] = L"01a45cef9";
1518         assert(std::regex_search(s, m, std::wregex(L"[ace1-9]+",
1519                                                  std::regex_constants::awk)));
1520         assert(m.size() == 1);
1521         assert(m.prefix().matched);
1522         assert(m.prefix().first == s);
1523         assert(m.prefix().second == m[0].first);
1524         assert(m.suffix().matched);
1525         assert(m.suffix().first == m[0].second);
1526         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
1527         assert(m.length(0) == 6);
1528         assert(m.position(0) == 1);
1529         assert(m.str(0) == L"1a45ce");
1530     }
1531     {
1532         const wchar_t r[] = L"^[-+]?[0-9]+[CF]$";
1533         std::ptrdiff_t sr = std::char_traits<wchar_t>::length(r);
1534         typedef forward_iterator<const wchar_t*> FI;
1535         typedef bidirectional_iterator<const wchar_t*> BI;
1536         std::wregex regex(FI(r), FI(r+sr), std::regex_constants::awk);
1537         std::match_results<BI> m;
1538         const wchar_t s[] = L"-40C";
1539         std::ptrdiff_t ss = std::char_traits<wchar_t>::length(s);
1540         assert(std::regex_search(BI(s), BI(s+ss), m, regex));
1541         assert(m.size() == 1);
1542         assert(!m.prefix().matched);
1543         assert(m.prefix().first == BI(s));
1544         assert(m.prefix().second == m[0].first);
1545         assert(!m.suffix().matched);
1546         assert(m.suffix().first == m[0].second);
1547         assert(m.suffix().second == m[0].second);
1548         assert(m.length(0) == 4);
1549         assert(m.position(0) == 0);
1550         assert(m.str(0) == s);
1551     }
1552     {
1553         std::wcmatch m;
1554         const wchar_t s[] = L"\n\n\n";
1555         assert(std::regex_search(s, m, std::wregex(L"[\\n]+",
1556                                                  std::regex_constants::awk)));
1557         assert(m.size() == 1);
1558         assert(!m.prefix().matched);
1559         assert(m.prefix().first == s);
1560         assert(m.prefix().second == m[0].first);
1561         assert(!m.suffix().matched);
1562         assert(m.suffix().first == m[0].second);
1563         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
1564         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
1565         assert(m.position(0) == 0);
1566         assert(m.str(0) == s);
1567     }
1568 }
1569