brintos

brintos / llvm-project-archived public Read only

0
0
Text · 54.9 KiB · ee88d11 Raw
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