brintos

brintos / llvm-project-archived public Read only

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