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