160 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <regex>10 11// class match_results<BidirectionalIterator, Allocator>12 13// template <class OutputIter>14// OutputIter15// format(OutputIter out, const char_type* fmt_first, const char_type* fmt_last,16// regex_constants::match_flag_type flags = regex_constants::format_default) const;17 18#include <regex>19#include <cassert>20 21#include "test_macros.h"22#include "test_iterators.h"23 24int main(int, char**)25{26 {27 std::match_results<const char*> m;28 const char s[] = "abcdefghijk";29 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));30 31 char out[100] = {0};32 const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";33 auto r = m.format(cpp17_output_iterator<char*>(out),34 fmt, fmt + std::char_traits<char>::length(fmt));35 assert(base(r) == out + 58);36 assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: efg, m[2]: e");37 }38 {39 std::match_results<const char*> m;40 const char s[] = "abcdefghijk";41 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi",42 std::regex_constants::nosubs)));43 44 char out[100] = {0};45 const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";46 auto r = m.format(cpp17_output_iterator<char*>(out),47 fmt, fmt + std::char_traits<char>::length(fmt));48 assert(base(r) == out + 54);49 assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: , m[2]: ");50 }51 {52 std::match_results<const char*> m;53 const char s[] = "abcdefghijk";54 assert(std::regex_search(s, m, std::regex("cdefghi")));55 56 char out[100] = {0};57 const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";58 auto r = m.format(cpp17_output_iterator<char*>(out),59 fmt, fmt + std::char_traits<char>::length(fmt));60 assert(base(r) == out + 54);61 assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: , m[2]: ");62 }63 {64 std::match_results<const char*> m;65 const char s[] = "abcdefghijk";66 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));67 68 char out[100] = {0};69 const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";70 auto r = m.format(cpp17_output_iterator<char*>(out),71 fmt, fmt + std::char_traits<char>::length(fmt),72 std::regex_constants::format_sed);73 assert(base(r) == out + 59);74 assert(std::string(out) == "prefix: $`, match: $cdefghi, suffix: $', m[1]: $1, m[2]: $2");75 }76 {77 std::match_results<const char*> m;78 const char s[] = "abcdefghijk";79 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));80 81 char out[100] = {0};82 const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";83 auto r = m.format(cpp17_output_iterator<char*>(out),84 fmt, fmt + std::char_traits<char>::length(fmt),85 std::regex_constants::format_sed);86 assert(base(r) == out + 34);87 assert(std::string(out) == "match: cdefghi, m[1]: efg, m[2]: e");88 }89 {90 std::match_results<const char*> m;91 const char s[] = "abcdefghijk";92 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi",93 std::regex_constants::nosubs)));94 95 char out[100] = {0};96 const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";97 auto r = m.format(cpp17_output_iterator<char*>(out),98 fmt, fmt + std::char_traits<char>::length(fmt),99 std::regex_constants::format_sed);100 assert(base(r) == out + 30);101 assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: ");102 }103 {104 std::match_results<const char*> m;105 const char s[] = "abcdefghijk";106 assert(std::regex_search(s, m, std::regex("cdefghi")));107 108 char out[100] = {0};109 const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";110 auto r = m.format(cpp17_output_iterator<char*>(out),111 fmt, fmt + std::char_traits<char>::length(fmt),112 std::regex_constants::format_sed);113 assert(base(r) == out + 30);114 assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: ");115 }116 117#ifndef TEST_HAS_NO_WIDE_CHARACTERS118 {119 std::match_results<const wchar_t*> m;120 const wchar_t s[] = L"abcdefghijk";121 assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));122 123 wchar_t out[100] = {0};124 const wchar_t fmt[] = L"prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";125 auto r = m.format(cpp17_output_iterator<wchar_t*>(out),126 fmt, fmt + std::char_traits<wchar_t>::length(fmt));127 assert(base(r) == out + 58);128 assert(std::wstring(out) == L"prefix: ab, match: cdefghi, suffix: jk, m[1]: efg, m[2]: e");129 }130 {131 std::match_results<const wchar_t*> m;132 const wchar_t s[] = L"abcdefghijk";133 assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));134 135 wchar_t out[100] = {0};136 const wchar_t fmt[] = L"prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";137 auto r = m.format(cpp17_output_iterator<wchar_t*>(out),138 fmt, fmt + std::char_traits<wchar_t>::length(fmt),139 std::regex_constants::format_sed);140 assert(base(r) == out + 59);141 assert(std::wstring(out) == L"prefix: $`, match: $cdefghi, suffix: $', m[1]: $1, m[2]: $2");142 }143 {144 std::match_results<const wchar_t*> m;145 const wchar_t s[] = L"abcdefghijk";146 assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));147 148 wchar_t out[100] = {0};149 const wchar_t fmt[] = L"match: &, m[1]: \\1, m[2]: \\2";150 auto r = m.format(cpp17_output_iterator<wchar_t*>(out),151 fmt, fmt + std::char_traits<wchar_t>::length(fmt),152 std::regex_constants::format_sed);153 assert(base(r) == out + 34);154 assert(std::wstring(out) == L"match: cdefghi, m[1]: efg, m[2]: e");155 }156#endif // TEST_HAS_NO_WIDE_CHARACTERS157 158 return 0;159}160