Commit 752416554086d5d34323bc14164d5084db83cfbd
1 parent
49f4600d
Add std::regex to c++11 feature tests
Showing
1 changed file
with
65 additions
and
0 deletions
libtests/cxx11.cc
| @@ -6,6 +6,7 @@ | @@ -6,6 +6,7 @@ | ||
| 6 | #include <vector> | 6 | #include <vector> |
| 7 | #include <map> | 7 | #include <map> |
| 8 | #include <memory> | 8 | #include <memory> |
| 9 | +#include <regex> | ||
| 9 | 10 | ||
| 10 | // Functional programming | 11 | // Functional programming |
| 11 | 12 | ||
| @@ -290,6 +291,69 @@ void do_smart_pointers() | @@ -290,6 +291,69 @@ void do_smart_pointers() | ||
| 290 | C::check(0, 0, 0); | 291 | C::check(0, 0, 0); |
| 291 | } | 292 | } |
| 292 | 293 | ||
| 294 | +// Regular expressions | ||
| 295 | + | ||
| 296 | +void do_regex() | ||
| 297 | +{ | ||
| 298 | + // Basic match/search. Match matches whole string; search searches | ||
| 299 | + // within string. Use std::smatch for matching std::string and | ||
| 300 | + // std::cmatch for matching char const*. | ||
| 301 | + | ||
| 302 | + std::regex expr1("([0-9]+)"); | ||
| 303 | + std::regex expr2("([0-9]+)\\s*([a-z]+)[[:space:]]*([0-9]+)"); | ||
| 304 | + std::string str1("one 234 fifth 678 nine"); | ||
| 305 | + std::string str2("234 five 678 nine"); | ||
| 306 | + std::string str3("one 234 five 678"); | ||
| 307 | + std::string str4("234"); | ||
| 308 | + std::string str5("234 five 678"); | ||
| 309 | + std::smatch match1; | ||
| 310 | + assert(! std::regex_match(str1, match1, expr1)); | ||
| 311 | + assert(! std::regex_match(str2, match1, expr1)); | ||
| 312 | + assert(! std::regex_match(str3, match1, expr1)); | ||
| 313 | + assert(std::regex_match(str4, match1, expr1)); | ||
| 314 | + assert(match1[0].first == match1[1].first); | ||
| 315 | + assert(match1[0].second == match1[1].second); | ||
| 316 | + std::string s; | ||
| 317 | + s.assign(match1[1].first, match1[1].second); | ||
| 318 | + assert("234" == s); | ||
| 319 | + assert(s == match1[1].str()); | ||
| 320 | + assert(std::regex_match(str5, match1, expr2)); | ||
| 321 | + assert("234 five 678" == match1[0].str()); | ||
| 322 | + assert("234" == match1[1].str()); | ||
| 323 | + assert("five" == match1[2].str()); | ||
| 324 | + assert("678" == match1[3].str()); | ||
| 325 | + assert(std::regex_search(str1, match1, expr2)); | ||
| 326 | + assert("234 fifth 678" == match1[0].str()); | ||
| 327 | + assert("234" == match1[1].str()); | ||
| 328 | + assert("fifth" == match1[2].str()); | ||
| 329 | + assert("678" == match1[3].str()); | ||
| 330 | + | ||
| 331 | + // Iterator | ||
| 332 | + std::regex expr3("[[:digit:]]+"); | ||
| 333 | + std::string str6 = "asdf234erasdf9453.kgdl423asdf"; | ||
| 334 | + std::sregex_iterator m1(str6.begin(), str6.end(), expr3); | ||
| 335 | + std::sregex_iterator m2; | ||
| 336 | + s.clear(); | ||
| 337 | + for (std::sregex_iterator iter = m1; iter != m2; ++iter) | ||
| 338 | + { | ||
| 339 | + std::smatch const& match2 = *iter; | ||
| 340 | + s += match2[0].str() + "|"; | ||
| 341 | + } | ||
| 342 | + assert("234|9453|423|" == s); | ||
| 343 | + | ||
| 344 | + // Submatches | ||
| 345 | + std::regex expr4("(?:(asdf)|(qwer))"); | ||
| 346 | + char const* str7 = "0asdf1qwer2"; | ||
| 347 | + std::cregex_iterator m3(str7, str7 + std::strlen(str7), expr4); | ||
| 348 | + assert("asdf" == (*m3)[0].str()); | ||
| 349 | + assert((*m3)[1].matched); | ||
| 350 | + assert(! (*m3)[2].matched); | ||
| 351 | + ++m3; | ||
| 352 | + assert("qwer" == (*m3)[0].str()); | ||
| 353 | + assert(! (*m3)[1].matched); | ||
| 354 | + assert((*m3)[2].matched); | ||
| 355 | +} | ||
| 356 | + | ||
| 293 | int main() | 357 | int main() |
| 294 | { | 358 | { |
| 295 | do_functional(); | 359 | do_functional(); |
| @@ -298,6 +362,7 @@ int main() | @@ -298,6 +362,7 @@ int main() | ||
| 298 | do_variadic(); | 362 | do_variadic(); |
| 299 | do_default_deleted(); | 363 | do_default_deleted(); |
| 300 | do_smart_pointers(); | 364 | do_smart_pointers(); |
| 365 | + do_regex(); | ||
| 301 | std::cout << "assertions passed\n"; | 366 | std::cout << "assertions passed\n"; |
| 302 | return 0; | 367 | return 0; |
| 303 | } | 368 | } |