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 // <regex>
     11 
     12 // template <class BidirectionalIterator, class Allocator, class charT, class traits>
     13 //     bool
     14 //     regex_match(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 
     22 #include "test_iterators.h"
     23 
     24 int main()
     25 {
     26     {
     27         std::cmatch m;
     28         const char s[] = "a";
     29         assert(std::regex_match(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_match(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_match(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_match(s, m, std::regex("ab")));
     68         assert(m.size() == 0);
     69     }
     70     {
     71         std::cmatch m;
     72         const char s[] = "aab";
     73         assert(!std::regex_match(s, m, std::regex("ab"),
     74                                             std::regex_constants::match_continuous));
     75         assert(m.size() == 0);
     76     }
     77     {
     78         std::cmatch m;
     79         const char s[] = "abcd";
     80         assert(!std::regex_match(s, m, std::regex("bc")));
     81         assert(m.size() == 0);
     82     }
     83     {
     84         std::cmatch m;
     85         const char s[] = "abbc";
     86         assert(std::regex_match(s, m, std::regex("ab*c")));
     87         assert(m.size() == 1);
     88         assert(!m.prefix().matched);
     89         assert(m.prefix().first == s);
     90         assert(m.prefix().second == m[0].first);
     91         assert(!m.suffix().matched);
     92         assert(m.suffix().first == m[0].second);
     93         assert(m.suffix().second == s+4);
     94         assert(m.length(0) == 4);
     95         assert(m.position(0) == 0);
     96         assert(m.str(0) == s);
     97     }
     98     {
     99         std::cmatch m;
    100         const char s[] = "ababc";
    101         assert(std::regex_match(s, m, std::regex("(ab)*c")));
    102         assert(m.size() == 2);
    103         assert(!m.prefix().matched);
    104         assert(m.prefix().first == s);
    105         assert(m.prefix().second == m[0].first);
    106         assert(!m.suffix().matched);
    107         assert(m.suffix().first == m[0].second);
    108         assert(m.suffix().second == s+5);
    109         assert(m.length(0) == 5);
    110         assert(m.position(0) == 0);
    111         assert(m.str(0) == s);
    112         assert(m.length(1) == 2);
    113         assert(m.position(1) == 2);
    114         assert(m.str(1) == "ab");
    115     }
    116     {
    117         std::cmatch m;
    118         const char s[] = "abcdefghijk";
    119         assert(!std::regex_match(s, m, std::regex("cd((e)fg)hi")));
    120         assert(m.size() == 0);
    121     }
    122     {
    123         std::cmatch m;
    124         const char s[] = "abc";
    125         assert(std::regex_match(s, m, std::regex("^abc")));
    126         assert(m.size() == 1);
    127         assert(!m.prefix().matched);
    128         assert(m.prefix().first == s);
    129         assert(m.prefix().second == m[0].first);
    130         assert(!m.suffix().matched);
    131         assert(m.suffix().first == m[0].second);
    132         assert(m.suffix().second == s+3);
    133         assert(m.length(0) == 3);
    134         assert(m.position(0) == 0);
    135         assert(m.str(0) == s);
    136     }
    137     {
    138         std::cmatch m;
    139         const char s[] = "abcd";
    140         assert(!std::regex_match(s, m, std::regex("^abc")));
    141         assert(m.size() == 0);
    142     }
    143     {
    144         std::cmatch m;
    145         const char s[] = "aabc";
    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[] = "abc";
    152         assert(std::regex_match(s, m, std::regex("abc$")));
    153         assert(m.size() == 1);
    154         assert(!m.prefix().matched);
    155         assert(m.prefix().first == s);
    156         assert(m.prefix().second == m[0].first);
    157         assert(!m.suffix().matched);
    158         assert(m.suffix().first == m[0].second);
    159         assert(m.suffix().second == s+3);
    160         assert(m.length(0) == 3);
    161         assert(m.position(0) == 0);
    162         assert(m.str(0) == s);
    163     }
    164     {
    165         std::cmatch m;
    166         const char s[] = "efabc";
    167         assert(!std::regex_match(s, m, std::regex("abc$")));
    168         assert(m.size() == 0);
    169     }
    170     {
    171         std::cmatch m;
    172         const char s[] = "efabcg";
    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[] = "abc";
    179         assert(std::regex_match(s, m, std::regex("a.c")));
    180         assert(m.size() == 1);
    181         assert(!m.prefix().matched);
    182         assert(m.prefix().first == s);
    183         assert(m.prefix().second == m[0].first);
    184         assert(!m.suffix().matched);
    185         assert(m.suffix().first == m[0].second);
    186         assert(m.suffix().second == s+3);
    187         assert(m.length(0) == 3);
    188         assert(m.position(0) == 0);
    189         assert(m.str(0) == s);
    190     }
    191     {
    192         std::cmatch m;
    193         const char s[] = "acc";
    194         assert(std::regex_match(s, m, std::regex("a.c")));
    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[] = "acc";
    209         assert(std::regex_match(s, m, std::regex("a.c")));
    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+3);
    217         assert(m.length(0) == 3);
    218         assert(m.position(0) == 0);
    219         assert(m.str(0) == s);
    220     }
    221     {
    222         std::cmatch m;
    223         const char s[] = "abcdef";
    224         assert(std::regex_match(s, m, std::regex("(.*).*")));
    225         assert(m.size() == 2);
    226         assert(!m.prefix().matched);
    227         assert(m.prefix().first == s);
    228         assert(m.prefix().second == m[0].first);
    229         assert(!m.suffix().matched);
    230         assert(m.suffix().first == m[0].second);
    231         assert(m.suffix().second == s+6);
    232         assert(m.length(0) == 6);
    233         assert(m.position(0) == 0);
    234         assert(m.str(0) == s);
    235         assert(m.length(1) == 6);
    236         assert(m.position(1) == 0);
    237         assert(m.str(1) == s);
    238     }
    239     {
    240         std::cmatch m;
    241         const char s[] = "bc";
    242         assert(!std::regex_match(s, m, std::regex("(a*)*")));
    243         assert(m.size() == 0);
    244     }
    245     {
    246         std::cmatch m;
    247         const char s[] = "abbc";
    248         assert(!std::regex_match(s, m, std::regex("ab{3,5}c")));
    249         assert(m.size() == 0);
    250     }
    251     {
    252         std::cmatch m;
    253         const char s[] = "abbbc";
    254         assert(std::regex_match(s, m, std::regex("ab{3,5}c")));
    255         assert(m.size() == 1);
    256         assert(!m.prefix().matched);
    257         assert(m.prefix().first == s);
    258         assert(m.prefix().second == m[0].first);
    259         assert(!m.suffix().matched);
    260         assert(m.suffix().first == m[0].second);
    261         assert(m.suffix().second == m[0].second);
    262         assert(m.length(0) == std::char_traits<char>::length(s));
    263         assert(m.position(0) == 0);
    264         assert(m.str(0) == s);
    265     }
    266     {
    267         std::cmatch m;
    268         const char s[] = "abbbbc";
    269         assert(std::regex_match(s, m, std::regex("ab{3,5}c")));
    270         assert(m.size() == 1);
    271         assert(!m.prefix().matched);
    272         assert(m.prefix().first == s);
    273         assert(m.prefix().second == m[0].first);
    274         assert(!m.suffix().matched);
    275         assert(m.suffix().first == m[0].second);
    276         assert(m.suffix().second == m[0].second);
    277         assert(m.length(0) == std::char_traits<char>::length(s));
    278         assert(m.position(0) == 0);
    279         assert(m.str(0) == s);
    280     }
    281     {
    282         std::cmatch m;
    283         const char s[] = "abbbbbc";
    284         assert(std::regex_match(s, m, std::regex("ab{3,5}c")));
    285         assert(m.size() == 1);
    286         assert(!m.prefix().matched);
    287         assert(m.prefix().first == s);
    288         assert(m.prefix().second == m[0].first);
    289         assert(!m.suffix().matched);
    290         assert(m.suffix().first == m[0].second);
    291         assert(m.suffix().second == m[0].second);
    292         assert(m.length(0) == std::char_traits<char>::length(s));
    293         assert(m.position(0) == 0);
    294         assert(m.str(0) == s);
    295     }
    296     {
    297         std::cmatch m;
    298         const char s[] = "adefc";
    299         assert(!std::regex_match(s, m, std::regex("ab{3,5}c")));
    300         assert(m.size() == 0);
    301     }
    302     {
    303         std::cmatch m;
    304         const char s[] = "abbbbbbc";
    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[] = "adec";
    311         assert(!std::regex_match(s, m, std::regex("a.{3,5}c")));
    312         assert(m.size() == 0);
    313     }
    314     {
    315         std::cmatch m;
    316         const char s[] = "adefc";
    317         assert(std::regex_match(s, m, std::regex("a.{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) == 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[] = "adefgc";
    332         assert(std::regex_match(s, m, std::regex("a.{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) == 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[] = "adefghc";
    347         assert(std::regex_match(s, m, std::regex("a.{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) == 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[] = "adefghic";
    362         assert(!std::regex_match(s, m, std::regex("a.{3,5}c")));
    363         assert(m.size() == 0);
    364     }
    365     {
    366         std::cmatch m;
    367         const char s[] = "tournament";
    368         assert(!std::regex_match(s, m, std::regex("tour|to|tournament")));
    369         assert(m.size() == 0);
    370     }
    371     {
    372         std::cmatch m;
    373         const char s[] = "tournamenttotour";
    374         assert(!std::regex_match(s, m, std::regex("(tour|to|tournament)+",
    375                std::regex_constants::nosubs)));
    376         assert(m.size() == 0);
    377     }
    378     {
    379         std::cmatch m;
    380         const char s[] = "ttotour";
    381         assert(std::regex_match(s, m, std::regex("(tour|to|t)+")));
    382         assert(m.size() == 2);
    383         assert(!m.prefix().matched);
    384         assert(m.prefix().first == s);
    385         assert(m.prefix().second == m[0].first);
    386         assert(!m.suffix().matched);
    387         assert(m.suffix().first == m[0].second);
    388         assert(m.suffix().second == m[0].second);
    389         assert(m.length(0) == std::char_traits<char>::length(s));
    390         assert(m.position(0) == 0);
    391         assert(m.str(0) == s);
    392         assert(m.length(1) == 4);
    393         assert(m.position(1) == 3);
    394         assert(m.str(1) == "tour");
    395     }
    396     {
    397         std::cmatch m;
    398         const char s[] = "-ab,ab-";
    399         assert(!std::regex_match(s, m, std::regex("-(.*),\1-")));
    400         assert(m.size() == 0);
    401     }
    402     {
    403         std::cmatch m;
    404         const char s[] = "-ab,ab-";
    405         assert(std::regex_match(s, m, std::regex("-.*,.*-")));
    406         assert(m.size() == 1);
    407         assert(!m.prefix().matched);
    408         assert(m.prefix().first == s);
    409         assert(m.prefix().second == m[0].first);
    410         assert(!m.suffix().matched);
    411         assert(m.suffix().first == m[0].second);
    412         assert(m.suffix().second == m[0].second);
    413         assert(m.length(0) == std::char_traits<char>::length(s));
    414         assert(m.position(0) == 0);
    415         assert(m.str(0) == s);
    416     }
    417     {
    418         std::cmatch m;
    419         const char s[] = "a";
    420         assert(std::regex_match(s, m, std::regex("^[a]$")));
    421         assert(m.size() == 1);
    422         assert(!m.prefix().matched);
    423         assert(m.prefix().first == s);
    424         assert(m.prefix().second == m[0].first);
    425         assert(!m.suffix().matched);
    426         assert(m.suffix().first == m[0].second);
    427         assert(m.suffix().second == m[0].second);
    428         assert(m.length(0) == 1);
    429         assert(m.position(0) == 0);
    430         assert(m.str(0) == "a");
    431     }
    432     {
    433         std::cmatch m;
    434         const char s[] = "a";
    435         assert(std::regex_match(s, m, std::regex("^[ab]$")));
    436         assert(m.size() == 1);
    437         assert(!m.prefix().matched);
    438         assert(m.prefix().first == s);
    439         assert(m.prefix().second == m[0].first);
    440         assert(!m.suffix().matched);
    441         assert(m.suffix().first == m[0].second);
    442         assert(m.suffix().second == m[0].second);
    443         assert(m.length(0) == 1);
    444         assert(m.position(0) == 0);
    445         assert(m.str(0) == "a");
    446     }
    447     {
    448         std::cmatch m;
    449         const char s[] = "c";
    450         assert(std::regex_match(s, m, std::regex("^[a-f]$")));
    451         assert(m.size() == 1);
    452         assert(!m.prefix().matched);
    453         assert(m.prefix().first == s);
    454         assert(m.prefix().second == m[0].first);
    455         assert(!m.suffix().matched);
    456         assert(m.suffix().first == m[0].second);
    457         assert(m.suffix().second == m[0].second);
    458         assert(m.length(0) == 1);
    459         assert(m.position(0) == 0);
    460         assert(m.str(0) == s);
    461     }
    462     {
    463         std::cmatch m;
    464         const char s[] = "g";
    465         assert(!std::regex_match(s, m, std::regex("^[a-f]$")));
    466         assert(m.size() == 0);
    467     }
    468     {
    469         std::cmatch m;
    470         const char s[] = "Iraqi";
    471         assert(!std::regex_match(s, m, std::regex("q[^u]")));
    472         assert(m.size() == 0);
    473     }
    474     {
    475         std::cmatch m;
    476         const char s[] = "Iraq";
    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[] = "AmB";
    483         assert(std::regex_match(s, m, std::regex("A[[:lower:]]B")));
    484         assert(m.size() == 1);
    485         assert(!m.prefix().matched);
    486         assert(m.prefix().first == s);
    487         assert(m.prefix().second == m[0].first);
    488         assert(!m.suffix().matched);
    489         assert(m.suffix().first == m[0].second);
    490         assert(m.suffix().second == m[0].second);
    491         assert(m.length(0) == std::char_traits<char>::length(s));
    492         assert(m.position(0) == 0);
    493         assert(m.str(0) == s);
    494     }
    495     {
    496         std::cmatch m;
    497         const char s[] = "AMB";
    498         assert(!std::regex_match(s, m, std::regex("A[[:lower:]]B")));
    499         assert(m.size() == 0);
    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() == 1);
    506         assert(!m.prefix().matched);
    507         assert(m.prefix().first == s);
    508         assert(m.prefix().second == m[0].first);
    509         assert(!m.suffix().matched);
    510         assert(m.suffix().first == m[0].second);
    511         assert(m.suffix().second == m[0].second);
    512         assert(m.length(0) == std::char_traits<char>::length(s));
    513         assert(m.position(0) == 0);
    514         assert(m.str(0) == s);
    515     }
    516     {
    517         std::cmatch m;
    518         const char s[] = "AmB";
    519         assert(!std::regex_match(s, m, std::regex("A[^[:lower:]]B")));
    520         assert(m.size() == 0);
    521     }
    522     {
    523         std::cmatch m;
    524         const char s[] = "A5B";
    525         assert(!std::regex_match(s, m, std::regex("A[^[:lower:]0-9]B")));
    526         assert(m.size() == 0);
    527     }
    528     {
    529         std::cmatch m;
    530         const char s[] = "A?B";
    531         assert(std::regex_match(s, m, std::regex("A[^[:lower:]0-9]B")));
    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) == std::char_traits<char>::length(s));
    540         assert(m.position(0) == 0);
    541         assert(m.str(0) == s);
    542     }
    543     {
    544         std::cmatch m;
    545         const char s[] = "-";
    546         assert(std::regex_match(s, m, std::regex("[a[.hyphen.]z]")));
    547         assert(m.size() == 1);
    548         assert(!m.prefix().matched);
    549         assert(m.prefix().first == s);
    550         assert(m.prefix().second == m[0].first);
    551         assert(!m.suffix().matched);
    552         assert(m.suffix().first == m[0].second);
    553         assert(m.suffix().second == m[0].second);
    554         assert(m.length(0) == std::char_traits<char>::length(s));
    555         assert(m.position(0) == 0);
    556         assert(m.str(0) == s);
    557     }
    558     {
    559         std::cmatch m;
    560         const char s[] = "z";
    561         assert(std::regex_match(s, m, std::regex("[a[.hyphen.]z]")));
    562         assert(m.size() == 1);
    563         assert(!m.prefix().matched);
    564         assert(m.prefix().first == s);
    565         assert(m.prefix().second == m[0].first);
    566         assert(!m.suffix().matched);
    567         assert(m.suffix().first == m[0].second);
    568         assert(m.suffix().second == m[0].second);
    569         assert(m.length(0) == std::char_traits<char>::length(s));
    570         assert(m.position(0) == 0);
    571         assert(m.str(0) == s);
    572     }
    573     {
    574         std::cmatch m;
    575         const char s[] = "m";
    576         assert(!std::regex_match(s, m, std::regex("[a[.hyphen.]z]")));
    577         assert(m.size() == 0);
    578     }
    579 /* Disable locale specific tests on Android because Android's NDK does not
    580  * support locales other than "C" and "POSIX".
    581  *
    582  * https://code.google.com/p/android/issues/detail?id=57313
    583  */
    584 #if !defined(__ANDROID__)
    585     std::locale::global(std::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 #endif
    631     {
    632         std::cmatch m;
    633         const char s[] = "m";
    634         assert(!std::regex_match(s, m, std::regex("[a[=M=]z]")));
    635         assert(m.size() == 0);
    636     }
    637     {
    638         std::cmatch m;
    639         const char s[] = "01a45cef9";
    640         assert(!std::regex_match(s, m, std::regex("[ace1-9]*")));
    641         assert(m.size() == 0);
    642     }
    643     {
    644         std::cmatch m;
    645         const char s[] = "01a45cef9";
    646         assert(!std::regex_match(s, m, std::regex("[ace1-9]+")));
    647         assert(m.size() == 0);
    648     }
    649     {
    650         const char r[] = "^[-+]?[0-9]+[CF]$";
    651         std::ptrdiff_t sr = std::char_traits<char>::length(r);
    652         typedef forward_iterator<const char*> FI;
    653         typedef bidirectional_iterator<const char*> BI;
    654         std::regex regex(FI(r), FI(r+sr));
    655         std::match_results<BI> m;
    656         const char s[] = "-40C";
    657         std::ptrdiff_t ss = std::char_traits<char>::length(s);
    658         assert(std::regex_match(BI(s), BI(s+ss), m, regex));
    659         assert(m.size() == 1);
    660         assert(!m.prefix().matched);
    661         assert(m.prefix().first == BI(s));
    662         assert(m.prefix().second == m[0].first);
    663         assert(!m.suffix().matched);
    664         assert(m.suffix().first == m[0].second);
    665         assert(m.suffix().second == m[0].second);
    666         assert(m.length(0) == 4);
    667         assert(m.position(0) == 0);
    668         assert(m.str(0) == s);
    669     }
    670     {
    671         std::cmatch m;
    672         const char s[] = "Jeff Jeffs ";
    673         assert(!std::regex_match(s, m, std::regex("Jeff(?=s\\b)")));
    674         assert(m.size() == 0);
    675     }
    676     {
    677         std::cmatch m;
    678         const char s[] = "Jeffs Jeff";
    679         assert(!std::regex_match(s, m, std::regex("Jeff(?!s\\b)")));
    680         assert(m.size() == 0);
    681     }
    682     {
    683         std::cmatch m;
    684         const char s[] = "5%k";
    685         assert(std::regex_match(s, m, std::regex("\\d[\\W]k")));
    686         assert(m.size() == 1);
    687         assert(!m.prefix().matched);
    688         assert(m.prefix().first == s);
    689         assert(m.prefix().second == m[0].first);
    690         assert(!m.suffix().matched);
    691         assert(m.suffix().first == m[0].second);
    692         assert(m.suffix().second == s + std::char_traits<char>::length(s));
    693         assert(m.length(0) == std::char_traits<char>::length(s));
    694         assert(m.position(0) == 0);
    695         assert(m.str(0) == s);
    696     }
    697 
    698     {
    699         std::wcmatch m;
    700         const wchar_t s[] = L"a";
    701         assert(std::regex_match(s, m, std::wregex(L"a")));
    702         assert(m.size() == 1);
    703         assert(!m.empty());
    704         assert(!m.prefix().matched);
    705         assert(m.prefix().first == s);
    706         assert(m.prefix().second == m[0].first);
    707         assert(!m.suffix().matched);
    708         assert(m.suffix().first == m[0].second);
    709         assert(m.suffix().second == s+1);
    710         assert(m.length(0) == 1);
    711         assert(m.position(0) == 0);
    712         assert(m.str(0) == L"a");
    713     }
    714     {
    715         std::wcmatch m;
    716         const wchar_t s[] = L"ab";
    717         assert(std::regex_match(s, m, std::wregex(L"ab")));
    718         assert(m.size() == 1);
    719         assert(!m.prefix().matched);
    720         assert(m.prefix().first == s);
    721         assert(m.prefix().second == m[0].first);
    722         assert(!m.suffix().matched);
    723         assert(m.suffix().first == m[0].second);
    724         assert(m.suffix().second == s+2);
    725         assert(m.length(0) == 2);
    726         assert(m.position(0) == 0);
    727         assert(m.str(0) == L"ab");
    728     }
    729     {
    730         std::wcmatch m;
    731         const wchar_t s[] = L"ab";
    732         assert(!std::regex_match(s, m, std::wregex(L"ba")));
    733         assert(m.size() == 0);
    734         assert(m.empty());
    735     }
    736     {
    737         std::wcmatch m;
    738         const wchar_t s[] = L"aab";
    739         assert(!std::regex_match(s, m, std::wregex(L"ab")));
    740         assert(m.size() == 0);
    741     }
    742     {
    743         std::wcmatch m;
    744         const wchar_t s[] = L"aab";
    745         assert(!std::regex_match(s, m, std::wregex(L"ab"),
    746                                             std::regex_constants::match_continuous));
    747         assert(m.size() == 0);
    748     }
    749     {
    750         std::wcmatch m;
    751         const wchar_t s[] = L"abcd";
    752         assert(!std::regex_match(s, m, std::wregex(L"bc")));
    753         assert(m.size() == 0);
    754     }
    755     {
    756         std::wcmatch m;
    757         const wchar_t s[] = L"abbc";
    758         assert(std::regex_match(s, m, std::wregex(L"ab*c")));
    759         assert(m.size() == 1);
    760         assert(!m.prefix().matched);
    761         assert(m.prefix().first == s);
    762         assert(m.prefix().second == m[0].first);
    763         assert(!m.suffix().matched);
    764         assert(m.suffix().first == m[0].second);
    765         assert(m.suffix().second == s+4);
    766         assert(m.length(0) == 4);
    767         assert(m.position(0) == 0);
    768         assert(m.str(0) == s);
    769     }
    770     {
    771         std::wcmatch m;
    772         const wchar_t s[] = L"ababc";
    773         assert(std::regex_match(s, m, std::wregex(L"(ab)*c")));
    774         assert(m.size() == 2);
    775         assert(!m.prefix().matched);
    776         assert(m.prefix().first == s);
    777         assert(m.prefix().second == m[0].first);
    778         assert(!m.suffix().matched);
    779         assert(m.suffix().first == m[0].second);
    780         assert(m.suffix().second == s+5);
    781         assert(m.length(0) == 5);
    782         assert(m.position(0) == 0);
    783         assert(m.str(0) == s);
    784         assert(m.length(1) == 2);
    785         assert(m.position(1) == 2);
    786         assert(m.str(1) == L"ab");
    787     }
    788     {
    789         std::wcmatch m;
    790         const wchar_t s[] = L"abcdefghijk";
    791         assert(!std::regex_match(s, m, std::wregex(L"cd((e)fg)hi")));
    792         assert(m.size() == 0);
    793     }
    794     {
    795         std::wcmatch m;
    796         const wchar_t s[] = L"abc";
    797         assert(std::regex_match(s, m, std::wregex(L"^abc")));
    798         assert(m.size() == 1);
    799         assert(!m.prefix().matched);
    800         assert(m.prefix().first == s);
    801         assert(m.prefix().second == m[0].first);
    802         assert(!m.suffix().matched);
    803         assert(m.suffix().first == m[0].second);
    804         assert(m.suffix().second == s+3);
    805         assert(m.length(0) == 3);
    806         assert(m.position(0) == 0);
    807         assert(m.str(0) == s);
    808     }
    809     {
    810         std::wcmatch m;
    811         const wchar_t s[] = L"abcd";
    812         assert(!std::regex_match(s, m, std::wregex(L"^abc")));
    813         assert(m.size() == 0);
    814     }
    815     {
    816         std::wcmatch m;
    817         const wchar_t s[] = L"aabc";
    818         assert(!std::regex_match(s, m, std::wregex(L"^abc")));
    819         assert(m.size() == 0);
    820     }
    821     {
    822         std::wcmatch m;
    823         const wchar_t s[] = L"abc";
    824         assert(std::regex_match(s, m, std::wregex(L"abc$")));
    825         assert(m.size() == 1);
    826         assert(!m.prefix().matched);
    827         assert(m.prefix().first == s);
    828         assert(m.prefix().second == m[0].first);
    829         assert(!m.suffix().matched);
    830         assert(m.suffix().first == m[0].second);
    831         assert(m.suffix().second == s+3);
    832         assert(m.length(0) == 3);
    833         assert(m.position(0) == 0);
    834         assert(m.str(0) == s);
    835     }
    836     {
    837         std::wcmatch m;
    838         const wchar_t s[] = L"efabc";
    839         assert(!std::regex_match(s, m, std::wregex(L"abc$")));
    840         assert(m.size() == 0);
    841     }
    842     {
    843         std::wcmatch m;
    844         const wchar_t s[] = L"efabcg";
    845         assert(!std::regex_match(s, m, std::wregex(L"abc$")));
    846         assert(m.size() == 0);
    847     }
    848     {
    849         std::wcmatch m;
    850         const wchar_t s[] = L"abc";
    851         assert(std::regex_match(s, m, std::wregex(L"a.c")));
    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+3);
    859         assert(m.length(0) == 3);
    860         assert(m.position(0) == 0);
    861         assert(m.str(0) == s);
    862     }
    863     {
    864         std::wcmatch m;
    865         const wchar_t s[] = L"acc";
    866         assert(std::regex_match(s, m, std::wregex(L"a.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+3);
    874         assert(m.length(0) == 3);
    875         assert(m.position(0) == 0);
    876         assert(m.str(0) == s);
    877     }
    878     {
    879         std::wcmatch m;
    880         const wchar_t s[] = L"acc";
    881         assert(std::regex_match(s, m, std::wregex(L"a.c")));
    882         assert(m.size() == 1);
    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+3);
    889         assert(m.length(0) == 3);
    890         assert(m.position(0) == 0);
    891         assert(m.str(0) == s);
    892     }
    893     {
    894         std::wcmatch m;
    895         const wchar_t s[] = L"abcdef";
    896         assert(std::regex_match(s, m, std::wregex(L"(.*).*")));
    897         assert(m.size() == 2);
    898         assert(!m.prefix().matched);
    899         assert(m.prefix().first == s);
    900         assert(m.prefix().second == m[0].first);
    901         assert(!m.suffix().matched);
    902         assert(m.suffix().first == m[0].second);
    903         assert(m.suffix().second == s+6);
    904         assert(m.length(0) == 6);
    905         assert(m.position(0) == 0);
    906         assert(m.str(0) == s);
    907         assert(m.length(1) == 6);
    908         assert(m.position(1) == 0);
    909         assert(m.str(1) == s);
    910     }
    911     {
    912         std::wcmatch m;
    913         const wchar_t s[] = L"bc";
    914         assert(!std::regex_match(s, m, std::wregex(L"(a*)*")));
    915         assert(m.size() == 0);
    916     }
    917     {
    918         std::wcmatch m;
    919         const wchar_t s[] = L"abbc";
    920         assert(!std::regex_match(s, m, std::wregex(L"ab{3,5}c")));
    921         assert(m.size() == 0);
    922     }
    923     {
    924         std::wcmatch m;
    925         const wchar_t s[] = L"abbbc";
    926         assert(std::regex_match(s, m, std::wregex(L"ab{3,5}c")));
    927         assert(m.size() == 1);
    928         assert(!m.prefix().matched);
    929         assert(m.prefix().first == s);
    930         assert(m.prefix().second == m[0].first);
    931         assert(!m.suffix().matched);
    932         assert(m.suffix().first == m[0].second);
    933         assert(m.suffix().second == m[0].second);
    934         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
    935         assert(m.position(0) == 0);
    936         assert(m.str(0) == s);
    937     }
    938     {
    939         std::wcmatch m;
    940         const wchar_t s[] = L"abbbbc";
    941         assert(std::regex_match(s, m, std::wregex(L"ab{3,5}c")));
    942         assert(m.size() == 1);
    943         assert(!m.prefix().matched);
    944         assert(m.prefix().first == s);
    945         assert(m.prefix().second == m[0].first);
    946         assert(!m.suffix().matched);
    947         assert(m.suffix().first == m[0].second);
    948         assert(m.suffix().second == m[0].second);
    949         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
    950         assert(m.position(0) == 0);
    951         assert(m.str(0) == s);
    952     }
    953     {
    954         std::wcmatch m;
    955         const wchar_t s[] = L"abbbbbc";
    956         assert(std::regex_match(s, m, std::wregex(L"ab{3,5}c")));
    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 == m[0].second);
    964         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
    965         assert(m.position(0) == 0);
    966         assert(m.str(0) == s);
    967     }
    968     {
    969         std::wcmatch m;
    970         const wchar_t s[] = L"adefc";
    971         assert(!std::regex_match(s, m, std::wregex(L"ab{3,5}c")));
    972         assert(m.size() == 0);
    973     }
    974     {
    975         std::wcmatch m;
    976         const wchar_t s[] = L"abbbbbbc";
    977         assert(!std::regex_match(s, m, std::wregex(L"ab{3,5}c")));
    978         assert(m.size() == 0);
    979     }
    980     {
    981         std::wcmatch m;
    982         const wchar_t s[] = L"adec";
    983         assert(!std::regex_match(s, m, std::wregex(L"a.{3,5}c")));
    984         assert(m.size() == 0);
    985     }
    986     {
    987         std::wcmatch m;
    988         const wchar_t s[] = L"adefc";
    989         assert(std::regex_match(s, m, std::wregex(L"a.{3,5}c")));
    990         assert(m.size() == 1);
    991         assert(!m.prefix().matched);
    992         assert(m.prefix().first == s);
    993         assert(m.prefix().second == m[0].first);
    994         assert(!m.suffix().matched);
    995         assert(m.suffix().first == m[0].second);
    996         assert(m.suffix().second == m[0].second);
    997         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
    998         assert(m.position(0) == 0);
    999         assert(m.str(0) == s);
   1000     }
   1001     {
   1002         std::wcmatch m;
   1003         const wchar_t s[] = L"adefgc";
   1004         assert(std::regex_match(s, m, std::wregex(L"a.{3,5}c")));
   1005         assert(m.size() == 1);
   1006         assert(!m.prefix().matched);
   1007         assert(m.prefix().first == s);
   1008         assert(m.prefix().second == m[0].first);
   1009         assert(!m.suffix().matched);
   1010         assert(m.suffix().first == m[0].second);
   1011         assert(m.suffix().second == m[0].second);
   1012         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1013         assert(m.position(0) == 0);
   1014         assert(m.str(0) == s);
   1015     }
   1016     {
   1017         std::wcmatch m;
   1018         const wchar_t s[] = L"adefghc";
   1019         assert(std::regex_match(s, m, std::wregex(L"a.{3,5}c")));
   1020         assert(m.size() == 1);
   1021         assert(!m.prefix().matched);
   1022         assert(m.prefix().first == s);
   1023         assert(m.prefix().second == m[0].first);
   1024         assert(!m.suffix().matched);
   1025         assert(m.suffix().first == m[0].second);
   1026         assert(m.suffix().second == m[0].second);
   1027         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1028         assert(m.position(0) == 0);
   1029         assert(m.str(0) == s);
   1030     }
   1031     {
   1032         std::wcmatch m;
   1033         const wchar_t s[] = L"adefghic";
   1034         assert(!std::regex_match(s, m, std::wregex(L"a.{3,5}c")));
   1035         assert(m.size() == 0);
   1036     }
   1037     {
   1038         std::wcmatch m;
   1039         const wchar_t s[] = L"tournament";
   1040         assert(!std::regex_match(s, m, std::wregex(L"tour|to|tournament")));
   1041         assert(m.size() == 0);
   1042     }
   1043     {
   1044         std::wcmatch m;
   1045         const wchar_t s[] = L"tournamenttotour";
   1046         assert(!std::regex_match(s, m, std::wregex(L"(tour|to|tournament)+",
   1047                std::regex_constants::nosubs)));
   1048         assert(m.size() == 0);
   1049     }
   1050     {
   1051         std::wcmatch m;
   1052         const wchar_t s[] = L"ttotour";
   1053         assert(std::regex_match(s, m, std::wregex(L"(tour|to|t)+")));
   1054         assert(m.size() == 2);
   1055         assert(!m.prefix().matched);
   1056         assert(m.prefix().first == s);
   1057         assert(m.prefix().second == m[0].first);
   1058         assert(!m.suffix().matched);
   1059         assert(m.suffix().first == m[0].second);
   1060         assert(m.suffix().second == m[0].second);
   1061         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1062         assert(m.position(0) == 0);
   1063         assert(m.str(0) == s);
   1064         assert(m.length(1) == 4);
   1065         assert(m.position(1) == 3);
   1066         assert(m.str(1) == L"tour");
   1067     }
   1068     {
   1069         std::wcmatch m;
   1070         const wchar_t s[] = L"-ab,ab-";
   1071         assert(!std::regex_match(s, m, std::wregex(L"-(.*),\1-")));
   1072         assert(m.size() == 0);
   1073     }
   1074     {
   1075         std::wcmatch m;
   1076         const wchar_t s[] = L"-ab,ab-";
   1077         assert(std::regex_match(s, m, std::wregex(L"-.*,.*-")));
   1078         assert(m.size() == 1);
   1079         assert(!m.prefix().matched);
   1080         assert(m.prefix().first == s);
   1081         assert(m.prefix().second == m[0].first);
   1082         assert(!m.suffix().matched);
   1083         assert(m.suffix().first == m[0].second);
   1084         assert(m.suffix().second == m[0].second);
   1085         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1086         assert(m.position(0) == 0);
   1087         assert(m.str(0) == s);
   1088     }
   1089     {
   1090         std::wcmatch m;
   1091         const wchar_t s[] = L"a";
   1092         assert(std::regex_match(s, m, std::wregex(L"^[a]$")));
   1093         assert(m.size() == 1);
   1094         assert(!m.prefix().matched);
   1095         assert(m.prefix().first == s);
   1096         assert(m.prefix().second == m[0].first);
   1097         assert(!m.suffix().matched);
   1098         assert(m.suffix().first == m[0].second);
   1099         assert(m.suffix().second == m[0].second);
   1100         assert(m.length(0) == 1);
   1101         assert(m.position(0) == 0);
   1102         assert(m.str(0) == L"a");
   1103     }
   1104     {
   1105         std::wcmatch m;
   1106         const wchar_t s[] = L"a";
   1107         assert(std::regex_match(s, m, std::wregex(L"^[ab]$")));
   1108         assert(m.size() == 1);
   1109         assert(!m.prefix().matched);
   1110         assert(m.prefix().first == s);
   1111         assert(m.prefix().second == m[0].first);
   1112         assert(!m.suffix().matched);
   1113         assert(m.suffix().first == m[0].second);
   1114         assert(m.suffix().second == m[0].second);
   1115         assert(m.length(0) == 1);
   1116         assert(m.position(0) == 0);
   1117         assert(m.str(0) == L"a");
   1118     }
   1119     {
   1120         std::wcmatch m;
   1121         const wchar_t s[] = L"c";
   1122         assert(std::regex_match(s, m, std::wregex(L"^[a-f]$")));
   1123         assert(m.size() == 1);
   1124         assert(!m.prefix().matched);
   1125         assert(m.prefix().first == s);
   1126         assert(m.prefix().second == m[0].first);
   1127         assert(!m.suffix().matched);
   1128         assert(m.suffix().first == m[0].second);
   1129         assert(m.suffix().second == m[0].second);
   1130         assert(m.length(0) == 1);
   1131         assert(m.position(0) == 0);
   1132         assert(m.str(0) == s);
   1133     }
   1134     {
   1135         std::wcmatch m;
   1136         const wchar_t s[] = L"g";
   1137         assert(!std::regex_match(s, m, std::wregex(L"^[a-f]$")));
   1138         assert(m.size() == 0);
   1139     }
   1140     {
   1141         std::wcmatch m;
   1142         const wchar_t s[] = L"Iraqi";
   1143         assert(!std::regex_match(s, m, std::wregex(L"q[^u]")));
   1144         assert(m.size() == 0);
   1145     }
   1146     {
   1147         std::wcmatch m;
   1148         const wchar_t s[] = L"Iraq";
   1149         assert(!std::regex_match(s, m, std::wregex(L"q[^u]")));
   1150         assert(m.size() == 0);
   1151     }
   1152     {
   1153         std::wcmatch m;
   1154         const wchar_t s[] = L"AmB";
   1155         assert(std::regex_match(s, m, std::wregex(L"A[[:lower:]]B")));
   1156         assert(m.size() == 1);
   1157         assert(!m.prefix().matched);
   1158         assert(m.prefix().first == s);
   1159         assert(m.prefix().second == m[0].first);
   1160         assert(!m.suffix().matched);
   1161         assert(m.suffix().first == m[0].second);
   1162         assert(m.suffix().second == m[0].second);
   1163         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1164         assert(m.position(0) == 0);
   1165         assert(m.str(0) == s);
   1166     }
   1167     {
   1168         std::wcmatch m;
   1169         const wchar_t s[] = L"AMB";
   1170         assert(!std::regex_match(s, m, std::wregex(L"A[[:lower:]]B")));
   1171         assert(m.size() == 0);
   1172     }
   1173     {
   1174         std::wcmatch m;
   1175         const wchar_t s[] = L"AMB";
   1176         assert(std::regex_match(s, m, std::wregex(L"A[^[:lower:]]B")));
   1177         assert(m.size() == 1);
   1178         assert(!m.prefix().matched);
   1179         assert(m.prefix().first == s);
   1180         assert(m.prefix().second == m[0].first);
   1181         assert(!m.suffix().matched);
   1182         assert(m.suffix().first == m[0].second);
   1183         assert(m.suffix().second == m[0].second);
   1184         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1185         assert(m.position(0) == 0);
   1186         assert(m.str(0) == s);
   1187     }
   1188     {
   1189         std::wcmatch m;
   1190         const wchar_t s[] = L"AmB";
   1191         assert(!std::regex_match(s, m, std::wregex(L"A[^[:lower:]]B")));
   1192         assert(m.size() == 0);
   1193     }
   1194     {
   1195         std::wcmatch m;
   1196         const wchar_t s[] = L"A5B";
   1197         assert(!std::regex_match(s, m, std::wregex(L"A[^[:lower:]0-9]B")));
   1198         assert(m.size() == 0);
   1199     }
   1200     {
   1201         std::wcmatch m;
   1202         const wchar_t s[] = L"A?B";
   1203         assert(std::regex_match(s, m, std::wregex(L"A[^[:lower:]0-9]B")));
   1204         assert(m.size() == 1);
   1205         assert(!m.prefix().matched);
   1206         assert(m.prefix().first == s);
   1207         assert(m.prefix().second == m[0].first);
   1208         assert(!m.suffix().matched);
   1209         assert(m.suffix().first == m[0].second);
   1210         assert(m.suffix().second == m[0].second);
   1211         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1212         assert(m.position(0) == 0);
   1213         assert(m.str(0) == s);
   1214     }
   1215     {
   1216         std::wcmatch m;
   1217         const wchar_t s[] = L"-";
   1218         assert(std::regex_match(s, m, std::wregex(L"[a[.hyphen.]z]")));
   1219         assert(m.size() == 1);
   1220         assert(!m.prefix().matched);
   1221         assert(m.prefix().first == s);
   1222         assert(m.prefix().second == m[0].first);
   1223         assert(!m.suffix().matched);
   1224         assert(m.suffix().first == m[0].second);
   1225         assert(m.suffix().second == m[0].second);
   1226         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1227         assert(m.position(0) == 0);
   1228         assert(m.str(0) == s);
   1229     }
   1230     {
   1231         std::wcmatch m;
   1232         const wchar_t s[] = L"z";
   1233         assert(std::regex_match(s, m, std::wregex(L"[a[.hyphen.]z]")));
   1234         assert(m.size() == 1);
   1235         assert(!m.prefix().matched);
   1236         assert(m.prefix().first == s);
   1237         assert(m.prefix().second == m[0].first);
   1238         assert(!m.suffix().matched);
   1239         assert(m.suffix().first == m[0].second);
   1240         assert(m.suffix().second == m[0].second);
   1241         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1242         assert(m.position(0) == 0);
   1243         assert(m.str(0) == s);
   1244     }
   1245     {
   1246         std::wcmatch m;
   1247         const wchar_t s[] = L"m";
   1248         assert(!std::regex_match(s, m, std::wregex(L"[a[.hyphen.]z]")));
   1249         assert(m.size() == 0);
   1250     }
   1251 /* Disable locale specific tests on Android because Android's NDK does not
   1252  * support locales other than "C" and "POSIX".
   1253  *
   1254  * https://code.google.com/p/android/issues/detail?id=57313
   1255  */
   1256 #if !defined(__ANDROID__)
   1257     std::locale::global(std::locale("cs_CZ.ISO8859-2"));
   1258     {
   1259         std::wcmatch m;
   1260         const wchar_t s[] = L"m";
   1261         assert(std::regex_match(s, m, std::wregex(L"[a[=M=]z]")));
   1262         assert(m.size() == 1);
   1263         assert(!m.prefix().matched);
   1264         assert(m.prefix().first == s);
   1265         assert(m.prefix().second == m[0].first);
   1266         assert(!m.suffix().matched);
   1267         assert(m.suffix().first == m[0].second);
   1268         assert(m.suffix().second == m[0].second);
   1269         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1270         assert(m.position(0) == 0);
   1271         assert(m.str(0) == s);
   1272     }
   1273     {
   1274         std::wcmatch m;
   1275         const wchar_t s[] = L"Ch";
   1276         assert(std::regex_match(s, m, std::wregex(L"[a[.ch.]z]",
   1277                    std::regex_constants::icase)));
   1278         assert(m.size() == 1);
   1279         assert(!m.prefix().matched);
   1280         assert(m.prefix().first == s);
   1281         assert(m.prefix().second == m[0].first);
   1282         assert(!m.suffix().matched);
   1283         assert(m.suffix().first == m[0].second);
   1284         assert(m.suffix().second == m[0].second);
   1285         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1286         assert(m.position(0) == 0);
   1287         assert(m.str(0) == s);
   1288     }
   1289     std::locale::global(std::locale("C"));
   1290 #endif
   1291     {
   1292         std::wcmatch m;
   1293         const wchar_t s[] = L"m";
   1294         assert(!std::regex_match(s, m, std::wregex(L"[a[=M=]z]")));
   1295         assert(m.size() == 0);
   1296     }
   1297     {
   1298         std::wcmatch m;
   1299         const wchar_t s[] = L"01a45cef9";
   1300         assert(!std::regex_match(s, m, std::wregex(L"[ace1-9]*")));
   1301         assert(m.size() == 0);
   1302     }
   1303     {
   1304         std::wcmatch m;
   1305         const wchar_t s[] = L"01a45cef9";
   1306         assert(!std::regex_match(s, m, std::wregex(L"[ace1-9]+")));
   1307         assert(m.size() == 0);
   1308     }
   1309     {
   1310         const wchar_t r[] = L"^[-+]?[0-9]+[CF]$";
   1311         std::ptrdiff_t sr = std::char_traits<wchar_t>::length(r);
   1312         typedef forward_iterator<const wchar_t*> FI;
   1313         typedef bidirectional_iterator<const wchar_t*> BI;
   1314         std::wregex regex(FI(r), FI(r+sr));
   1315         std::match_results<BI> m;
   1316         const wchar_t s[] = L"-40C";
   1317         std::ptrdiff_t ss = std::char_traits<wchar_t>::length(s);
   1318         assert(std::regex_match(BI(s), BI(s+ss), m, regex));
   1319         assert(m.size() == 1);
   1320         assert(!m.prefix().matched);
   1321         assert(m.prefix().first == BI(s));
   1322         assert(m.prefix().second == m[0].first);
   1323         assert(!m.suffix().matched);
   1324         assert(m.suffix().first == m[0].second);
   1325         assert(m.suffix().second == m[0].second);
   1326         assert(m.length(0) == 4);
   1327         assert(m.position(0) == 0);
   1328         assert(m.str(0) == s);
   1329     }
   1330     {
   1331         std::wcmatch m;
   1332         const wchar_t s[] = L"Jeff Jeffs ";
   1333         assert(!std::regex_match(s, m, std::wregex(L"Jeff(?=s\\b)")));
   1334         assert(m.size() == 0);
   1335     }
   1336     {
   1337         std::wcmatch m;
   1338         const wchar_t s[] = L"Jeffs Jeff";
   1339         assert(!std::regex_match(s, m, std::wregex(L"Jeff(?!s\\b)")));
   1340         assert(m.size() == 0);
   1341     }
   1342     {
   1343         std::wcmatch m;
   1344         const wchar_t s[] = L"5%k";
   1345         assert(std::regex_match(s, m, std::wregex(L"\\d[\\W]k")));
   1346         assert(m.size() == 1);
   1347         assert(!m.prefix().matched);
   1348         assert(m.prefix().first == s);
   1349         assert(m.prefix().second == m[0].first);
   1350         assert(!m.suffix().matched);
   1351         assert(m.suffix().first == m[0].second);
   1352         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
   1353         assert(m.length(0) == std::char_traits<wchar_t>::length(s));
   1354         assert(m.position(0) == 0);
   1355         assert(m.str(0) == s);
   1356     }
   1357 }
   1358