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