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