regex_test.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // Boost string_algo library substr_test.cpp file ------------------//
  2. // Copyright Pavol Droba 2002-2003. Use, modification and
  3. // distribution is subject to the Boost Software License, Version
  4. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. // See http://www.boost.org for updates, documentation, and revision history.
  7. #include <boost/algorithm/string/regex.hpp>
  8. #include <boost/algorithm/string/join.hpp>
  9. #include <boost/algorithm/string/sequence_traits.hpp>
  10. // equals predicate is used for result comparison
  11. #include <boost/algorithm/string/predicate.hpp>
  12. // Include unit test framework
  13. #define BOOST_TEST_MAIN
  14. #include <boost/test/unit_test.hpp>
  15. #include <string>
  16. #include <vector>
  17. #include <iostream>
  18. #include <boost/regex.hpp>
  19. #include <boost/test/test_tools.hpp>
  20. using namespace std;
  21. using namespace boost;
  22. static void find_test()
  23. {
  24. string str1("123a1cxxxa23cXXXa456c321");
  25. const char* pch1="123a1cxxxa23cXXXa456c321";
  26. regex rx("a[0-9]+c");
  27. vector<int> vec1( str1.begin(), str1.end() );
  28. vector<string> tokens;
  29. // find results
  30. iterator_range<string::iterator> nc_result;
  31. iterator_range<string::const_iterator> cv_result;
  32. iterator_range<vector<int>::iterator> nc_vresult;
  33. iterator_range<vector<int>::const_iterator> cv_vresult;
  34. iterator_range<const char*> ch_result;
  35. // basic tests
  36. nc_result=find_regex( str1, rx );
  37. BOOST_CHECK(
  38. ( (nc_result.begin()-str1.begin()) == 3) &&
  39. ( (nc_result.end()-str1.begin()) == 6) );
  40. cv_result=find_regex( str1, rx );
  41. BOOST_CHECK(
  42. ( (cv_result.begin()-str1.begin()) == 3) &&
  43. ( (cv_result.end()-str1.begin()) == 6) );
  44. ch_result=find_regex( pch1, rx );
  45. BOOST_CHECK(( (ch_result.begin() - pch1 ) == 3) && ( (ch_result.end() - pch1 ) == 6 ) );
  46. // multi-type comparison test
  47. nc_vresult=find_regex( vec1, rx );
  48. BOOST_CHECK(
  49. ( (nc_result.begin()-str1.begin()) == 3) &&
  50. ( (nc_result.end()-str1.begin()) == 6) );
  51. cv_vresult=find_regex( vec1, rx );
  52. BOOST_CHECK(
  53. ( (cv_result.begin()-str1.begin()) == 3) &&
  54. ( (cv_result.end()-str1.begin()) == 6) );
  55. // find_all_regex test
  56. find_all_regex( tokens, str1, rx );
  57. BOOST_REQUIRE( tokens.size()==3 );
  58. BOOST_CHECK( tokens[0]==string("a1c") );
  59. BOOST_CHECK( tokens[1]==string("a23c") );
  60. BOOST_CHECK( tokens[2]==string("a456c") );
  61. // split_regex test
  62. split_regex( tokens, str1, rx );
  63. BOOST_REQUIRE( tokens.size()==4 );
  64. BOOST_CHECK( tokens[0]==string("123") );
  65. BOOST_CHECK( tokens[1]==string("xxx") );
  66. BOOST_CHECK( tokens[2]==string("XXX") );
  67. BOOST_CHECK( tokens[3]==string("321") );
  68. }
  69. static void join_test()
  70. {
  71. // Prepare inputs
  72. vector<string> tokens1;
  73. tokens1.push_back("xx");
  74. tokens1.push_back("abc");
  75. tokens1.push_back("xx");
  76. #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
  77. BOOST_CHECK( equals(join_if(tokens1, "-", regex("x+")), "xx-xx") );
  78. BOOST_CHECK( equals(join_if(tokens1, "-", regex("[abc]+")), "abc") );
  79. #else
  80. BOOST_CHECK( equals(join_if_regex(tokens1, "-", regex("x+")), "xx-xx") );
  81. BOOST_CHECK( equals(join_if_regex(tokens1, "-", regex("[abc]+")), "abc") );
  82. #endif
  83. }
  84. static void replace_test()
  85. {
  86. string str1("123a1cxxxa23cXXXa456c321");
  87. regex rx1("a([0-9]+)c");
  88. regex rx2("([xX]+)");
  89. regex rx3("_[^_]*_");
  90. string fmt1("_A$1C_");
  91. string fmt2("_xXx_");
  92. vector<int> vec1( str1.begin(), str1.end() );
  93. // immutable tests
  94. // basic tests
  95. BOOST_CHECK( replace_regex_copy( str1, rx1, fmt1 )==string("123_A1C_xxxa23cXXXa456c321") );
  96. BOOST_CHECK( replace_all_regex_copy( str1, rx1, fmt1 )==string("123_A1C_xxx_A23C_XXX_A456C_321") );
  97. BOOST_CHECK( erase_regex_copy( str1, rx1 )==string("123xxxa23cXXXa456c321") );
  98. BOOST_CHECK( erase_all_regex_copy( str1, rx1 )==string(string("123xxxXXX321")) );
  99. // output iterator variants test
  100. string strout;
  101. replace_regex_copy( back_inserter(strout), str1, rx1, fmt1 );
  102. BOOST_CHECK( strout==string("123_A1C_xxxa23cXXXa456c321") );
  103. strout.clear();
  104. replace_all_regex_copy( back_inserter(strout), str1, rx1, fmt1 );
  105. BOOST_CHECK( strout==string("123_A1C_xxx_A23C_XXX_A456C_321") );
  106. strout.clear();
  107. erase_regex_copy( back_inserter(strout), str1, rx1 );
  108. BOOST_CHECK( strout==string("123xxxa23cXXXa456c321") );
  109. strout.clear();
  110. erase_all_regex_copy( back_inserter(strout), str1, rx1 );
  111. BOOST_CHECK( strout==string("123xxxXXX321") );
  112. strout.clear();
  113. // in-place test
  114. replace_regex( str1, rx1, fmt2 );
  115. BOOST_CHECK( str1==string("123_xXx_xxxa23cXXXa456c321") );
  116. replace_all_regex( str1, rx2, fmt1 );
  117. BOOST_CHECK( str1==string("123__AxXxC___AxxxC_a23c_AXXXC_a456c321") );
  118. erase_regex( str1, rx3 );
  119. BOOST_CHECK( str1==string("123AxXxC___AxxxC_a23c_AXXXC_a456c321") );
  120. erase_all_regex( str1, rx3 );
  121. BOOST_CHECK( str1==string("123AxXxCa23ca456c321") );
  122. }
  123. BOOST_AUTO_TEST_CASE( test_main )
  124. {
  125. find_test();
  126. join_test();
  127. replace_test();
  128. }