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