From a8d775970841ca062fcd44fb16f7b164ce4f3aae Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Wed, 18 Aug 2010 00:13:08 +0000 Subject: [PATCH] [re.alg.replace]. This finishes all of . That being said, is exceptionally difficult to thoroughly test. If anyone has the ability to test this, combined with the interest to do so, now would be a good time. :-) git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@111333 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/regex | 107 ++++++++++++++++++ test/re/re.alg/re.alg.replace/test1.pass.cpp | 107 ++++++++++++++++++ test/re/re.alg/re.alg.replace/test2.pass.cpp | 107 ++++++++++++++++++ test/re/re.alg/re.alg.replace/test3.pass.cpp | 73 ++++++++++++ test/re/re.alg/re.alg.replace/test4.pass.cpp | 72 ++++++++++++ test/re/re.alg/re.alg.replace/test5.pass.cpp | 73 ++++++++++++ test/re/re.alg/re.alg.replace/test6.pass.cpp | 73 ++++++++++++ .../re.regiter.cnstr/cnstr.pass.cpp | 2 +- .../re.tokiter.cnstr/array.pass.cpp | 2 +- .../re.tokiter.cnstr/default.pass.cpp | 2 +- .../re.tokiter/re.tokiter.cnstr/init.pass.cpp | 2 +- .../re.tokiter/re.tokiter.cnstr/int.pass.cpp | 2 +- .../re.tokiter.cnstr/vector.pass.cpp | 2 +- .../re.tokiter/re.tokiter.comp/equal.pass.cpp | 2 +- .../re.tokiter.deref/deref.pass.cpp | 2 +- .../re.tokiter/re.tokiter.incr/post.pass.cpp | 2 +- 16 files changed, 621 insertions(+), 9 deletions(-) create mode 100644 test/re/re.alg/re.alg.replace/test1.pass.cpp create mode 100644 test/re/re.alg/re.alg.replace/test2.pass.cpp create mode 100644 test/re/re.alg/re.alg.replace/test3.pass.cpp create mode 100644 test/re/re.alg/re.alg.replace/test4.pass.cpp create mode 100644 test/re/re.alg/re.alg.replace/test5.pass.cpp create mode 100644 test/re/re.alg/re.alg.replace/test6.pass.cpp diff --git a/include/regex b/include/regex index dc534988..3c33cc85 100644 --- a/include/regex +++ b/include/regex @@ -6271,6 +6271,113 @@ typedef regex_token_iterator wcregex_token_iterator; typedef regex_token_iterator sregex_token_iterator; typedef regex_token_iterator wsregex_token_iterator; +// regex_replace + +template +_OutputIterator +regex_replace(_OutputIterator __out, + _BidirectionalIterator __first, _BidirectionalIterator __last, + const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter; + _Iter __i(__first, __last, __e, __flags); + _Iter __eof; + if (__i == __eof) + { + if (!(__flags & regex_constants::format_no_copy)) + __out = _STD::copy(__first, __last, __out); + } + else + { + sub_match<_BidirectionalIterator> __lm; + for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i) + { + if (!(__flags & regex_constants::format_no_copy)) + __out = _STD::copy(__i->prefix().first, __i->prefix().second, __out); + __out = __i->format(__out, __fmt, __fmt + __len, __flags); + __lm = __i->suffix(); + if (__flags & regex_constants::format_first_only) + break; + } + if (!(__flags & regex_constants::format_no_copy)) + __out = _STD::copy(__lm.first, __lm.second, __out); + } + return __out; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +regex_replace(_OutputIterator __out, + _BidirectionalIterator __first, _BidirectionalIterator __last, + const basic_regex<_CharT, _Traits>& __e, + const basic_string<_CharT, _ST, _SA>& __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + return _STD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, _ST, _SA> +regex_replace(const basic_string<_CharT, _ST, _SA>& __s, + const basic_regex<_CharT, _Traits>& __e, + const basic_string<_CharT, _FST, _FSA>& __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT, _ST, _SA> __r; + _STD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e, + __fmt.c_str(), __flags); + return __r; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, _ST, _SA> +regex_replace(const basic_string<_CharT, _ST, _SA>& __s, + const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT, _ST, _SA> __r; + _STD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e, + __fmt, __flags); + return __r; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT> +regex_replace(const _CharT* __s, + const basic_regex<_CharT, _Traits>& __e, + const basic_string<_CharT, _ST, _SA>& __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT> __r; + _STD::regex_replace(back_inserter(__r), __s, + __s + char_traits<_CharT>::length(__s), __e, + __fmt.c_str(), __flags); + return __r; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT> +regex_replace(const _CharT* __s, + const basic_regex<_CharT, _Traits>& __e, + const _CharT* __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT> __r; + _STD::regex_replace(back_inserter(__r), __s, + __s + char_traits<_CharT>::length(__s), __e, + __fmt, __flags); + return __r; +} + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_REGEX diff --git a/test/re/re.alg/re.alg.replace/test1.pass.cpp b/test/re/re.alg/re.alg.replace/test1.pass.cpp new file mode 100644 index 00000000..e370e3bd --- /dev/null +++ b/test/re/re.alg/re.alg.replace/test1.pass.cpp @@ -0,0 +1,107 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// OutputIterator +// regex_replace(OutputIterator out, +// BidirectionalIterator first, BidirectionalIterator last, +// const basic_regex& e, +// const basic_string& fmt, +// regex_constants::match_flag_type flags = +// regex_constants::match_default); + +#include +#include + +#include "../../iterators.h" + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + std::string("123-$&")); + assert(r.base() == buf+40); + assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + std::string("123-$&"), + std::regex_constants::format_sed); + assert(r.base() == buf+43); + assert(buf == std::string("123-$555-1234, 123-$555-2345, 123-$555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + std::string("123-&"), + std::regex_constants::format_sed); + assert(r.base() == buf+40); + assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + std::string("123-$&"), + std::regex_constants::format_no_copy); + assert(r.base() == buf+36); + assert(buf == std::string("123-555-1234123-555-2345123-555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + std::string("123-$&"), + std::regex_constants::format_first_only); + assert(r.base() == buf+32); + assert(buf == std::string("123-555-1234, 555-2345, 555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + std::string("123-$&"), + std::regex_constants::format_first_only | + std::regex_constants::format_no_copy); + assert(r.base() == buf+12); + assert(buf == std::string("123-555-1234")); + } +} diff --git a/test/re/re.alg/re.alg.replace/test2.pass.cpp b/test/re/re.alg/re.alg.replace/test2.pass.cpp new file mode 100644 index 00000000..351c6a93 --- /dev/null +++ b/test/re/re.alg/re.alg.replace/test2.pass.cpp @@ -0,0 +1,107 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// OutputIterator +// regex_replace(OutputIterator out, +// BidirectionalIterator first, BidirectionalIterator last, +// const basic_regex& e, +// const charT* fmt, +// regex_constants::match_flag_type flags = +// regex_constants::match_default); + +#include +#include + +#include "../../iterators.h" + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + "123-$&"); + assert(r.base() == buf+40); + assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + "123-$&", + std::regex_constants::format_sed); + assert(r.base() == buf+43); + assert(buf == std::string("123-$555-1234, 123-$555-2345, 123-$555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + "123-&", + std::regex_constants::format_sed); + assert(r.base() == buf+40); + assert(buf == std::string("123-555-1234, 123-555-2345, 123-555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + "123-$&", + std::regex_constants::format_no_copy); + assert(r.base() == buf+36); + assert(buf == std::string("123-555-1234123-555-2345123-555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + "123-$&", + std::regex_constants::format_first_only); + assert(r.base() == buf+32); + assert(buf == std::string("123-555-1234, 555-2345, 555-3456")); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + typedef output_iterator Out; + typedef bidirectional_iterator Bi; + char buf[100] = {0}; + Out r = std::regex_replace(Out(buf), Bi(std::begin(phone_book)), + Bi(std::end(phone_book)-1), phone_numbers, + "123-$&", + std::regex_constants::format_first_only | + std::regex_constants::format_no_copy); + assert(r.base() == buf+12); + assert(buf == std::string("123-555-1234")); + } +} diff --git a/test/re/re.alg/re.alg.replace/test3.pass.cpp b/test/re/re.alg/re.alg.replace/test3.pass.cpp new file mode 100644 index 00000000..0ec6880a --- /dev/null +++ b/test/re/re.alg/re.alg.replace/test3.pass.cpp @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template > +// basic_string +// regex_replace(const basic_string& s, +// const basic_regex& e, +// const basic_string& fmt, +// regex_constants::match_flag_type flags = +// regex_constants::match_default); + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&")); + assert(r == "123-555-1234, 123-555-2345, 123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&"), + std::regex_constants::format_sed); + assert(r == "123-$555-1234, 123-$555-2345, 123-$555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-&"), + std::regex_constants::format_sed); + assert(r == "123-555-1234, 123-555-2345, 123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&"), + std::regex_constants::format_no_copy); + assert(r == "123-555-1234123-555-2345123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&"), + std::regex_constants::format_first_only); + assert(r == "123-555-1234, 555-2345, 555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&"), + std::regex_constants::format_first_only | + std::regex_constants::format_no_copy); + assert(r == "123-555-1234"); + } +} diff --git a/test/re/re.alg/re.alg.replace/test4.pass.cpp b/test/re/re.alg/re.alg.replace/test4.pass.cpp new file mode 100644 index 00000000..b0ecf336 --- /dev/null +++ b/test/re/re.alg/re.alg.replace/test4.pass.cpp @@ -0,0 +1,72 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// basic_string +// regex_replace(const basic_string& s, +// const basic_regex& e, const charT* fmt, +// regex_constants::match_flag_type flags = +// regex_constants::match_default); + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&"); + assert(r == "123-555-1234, 123-555-2345, 123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&", + std::regex_constants::format_sed); + assert(r == "123-$555-1234, 123-$555-2345, 123-$555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-&", + std::regex_constants::format_sed); + assert(r == "123-555-1234, 123-555-2345, 123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&", + std::regex_constants::format_no_copy); + assert(r == "123-555-1234123-555-2345123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&", + std::regex_constants::format_first_only); + assert(r == "123-555-1234, 555-2345, 555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + std::string phone_book("555-1234, 555-2345, 555-3456"); + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&", + std::regex_constants::format_first_only | + std::regex_constants::format_no_copy); + assert(r == "123-555-1234"); + } +} diff --git a/test/re/re.alg/re.alg.replace/test5.pass.cpp b/test/re/re.alg/re.alg.replace/test5.pass.cpp new file mode 100644 index 00000000..14dc1c48 --- /dev/null +++ b/test/re/re.alg/re.alg.replace/test5.pass.cpp @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// basic_string +// regex_replace(const charT* s, +// const basic_regex& e, +// const basic_string& fmt, +// regex_constants::match_flag_type flags = +// regex_constants::match_default); + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&")); + assert(r == "123-555-1234, 123-555-2345, 123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&"), + std::regex_constants::format_sed); + assert(r == "123-$555-1234, 123-$555-2345, 123-$555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-&"), + std::regex_constants::format_sed); + assert(r == "123-555-1234, 123-555-2345, 123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&"), + std::regex_constants::format_no_copy); + assert(r == "123-555-1234123-555-2345123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&"), + std::regex_constants::format_first_only); + assert(r == "123-555-1234, 555-2345, 555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + std::string("123-$&"), + std::regex_constants::format_first_only | + std::regex_constants::format_no_copy); + assert(r == "123-555-1234"); + } +} diff --git a/test/re/re.alg/re.alg.replace/test6.pass.cpp b/test/re/re.alg/re.alg.replace/test6.pass.cpp new file mode 100644 index 00000000..bbacc9d4 --- /dev/null +++ b/test/re/re.alg/re.alg.replace/test6.pass.cpp @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// basic_string +// regex_replace(const charT* s, +// const basic_regex& e, +// const charT* fmt, +// regex_constants::match_flag_type flags = +// regex_constants::match_default); + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&"); + assert(r == "123-555-1234, 123-555-2345, 123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&", + std::regex_constants::format_sed); + assert(r == "123-$555-1234, 123-$555-2345, 123-$555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-&", + std::regex_constants::format_sed); + assert(r == "123-555-1234, 123-555-2345, 123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&", + std::regex_constants::format_no_copy); + assert(r == "123-555-1234123-555-2345123-555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&", + std::regex_constants::format_first_only); + assert(r == "123-555-1234, 555-2345, 555-3456"); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "555-1234, 555-2345, 555-3456"; + std::string r = std::regex_replace(phone_book, phone_numbers, + "123-$&", + std::regex_constants::format_first_only | + std::regex_constants::format_no_copy); + assert(r == "123-555-1234"); + } +} diff --git a/test/re/re.iter/re.regiter/re.regiter.cnstr/cnstr.pass.cpp b/test/re/re.iter/re.regiter/re.regiter.cnstr/cnstr.pass.cpp index 46f4a3eb..efffd13a 100644 --- a/test/re/re.iter/re.regiter/re.regiter.cnstr/cnstr.pass.cpp +++ b/test/re/re.iter/re.regiter/re.regiter.cnstr/cnstr.pass.cpp @@ -41,4 +41,4 @@ int main() ++i; assert(i == std::cregex_iterator()); } -} \ No newline at end of file +} diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/array.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/array.pass.cpp index c876fcf0..25ce1dcb 100644 --- a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/array.pass.cpp +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/array.pass.cpp @@ -61,4 +61,4 @@ int main() ++i; assert(i == std::cregex_token_iterator()); } -} \ No newline at end of file +} diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/default.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/default.pass.cpp index 88b5c239..5a99c71f 100644 --- a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/default.pass.cpp +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/default.pass.cpp @@ -29,4 +29,4 @@ int main() { test(); test(); -} \ No newline at end of file +} diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/init.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/init.pass.cpp index 1f85dec3..de74babf 100644 --- a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/init.pass.cpp +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/init.pass.cpp @@ -61,4 +61,4 @@ int main() assert(i == std::cregex_token_iterator()); } #endif -} \ No newline at end of file +} diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/int.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/int.pass.cpp index 45afd9bb..d8335fe3 100644 --- a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/int.pass.cpp +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/int.pass.cpp @@ -72,4 +72,4 @@ int main() ++i; assert(i == std::cregex_token_iterator()); } -} \ No newline at end of file +} diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.pass.cpp index f614f075..8e4b519e 100644 --- a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.pass.cpp +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.pass.cpp @@ -125,4 +125,4 @@ int main() ++i; assert(i == std::cregex_token_iterator()); } -} \ No newline at end of file +} diff --git a/test/re/re.iter/re.tokiter/re.tokiter.comp/equal.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.comp/equal.pass.cpp index d76c3b0f..d6f73d2b 100644 --- a/test/re/re.iter/re.tokiter/re.tokiter.comp/equal.pass.cpp +++ b/test/re/re.iter/re.tokiter/re.tokiter.comp/equal.pass.cpp @@ -33,4 +33,4 @@ int main() assert(!(i2 == i)); assert(i2 != i); } -} \ No newline at end of file +} diff --git a/test/re/re.iter/re.tokiter/re.tokiter.deref/deref.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.deref/deref.pass.cpp index a2599d56..32f85055 100644 --- a/test/re/re.iter/re.tokiter/re.tokiter.deref/deref.pass.cpp +++ b/test/re/re.iter/re.tokiter/re.tokiter.deref/deref.pass.cpp @@ -69,4 +69,4 @@ int main() ++i; assert(i == std::cregex_token_iterator()); } -} \ No newline at end of file +} diff --git a/test/re/re.iter/re.tokiter/re.tokiter.incr/post.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.incr/post.pass.cpp index 105ecf76..b7f753ab 100644 --- a/test/re/re.iter/re.tokiter/re.tokiter.incr/post.pass.cpp +++ b/test/re/re.iter/re.tokiter/re.tokiter.incr/post.pass.cpp @@ -69,4 +69,4 @@ int main() i++; assert(i == std::cregex_token_iterator()); } -} \ No newline at end of file +}