[re.alg.replace]. This finishes all of <regex>. That being said, <regex> 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. :-)

llvm-svn: 111333
This commit is contained in:
Howard Hinnant 2010-08-18 00:13:08 +00:00
parent 03e17f8387
commit 86550b0038
16 changed files with 621 additions and 9 deletions

View File

@ -6271,6 +6271,113 @@ typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
// regex_replace
template <class _OutputIterator, class _BidirectionalIterator,
class _Traits, class _CharT>
_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 <class _OutputIterator, class _BidirectionalIterator,
class _Traits, class _CharT, class _ST, class _SA>
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 <class _Traits, class _CharT, class _ST, class _SA, class _FST,
class _FSA>
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 <class _Traits, class _CharT, class _ST, class _SA>
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 <class _Traits, class _CharT, class _ST, class _SA>
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 <class _Traits, class _CharT>
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

View File

@ -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.
//
//===----------------------------------------------------------------------===//
// <regex>
// template <class OutputIterator, class BidirectionalIterator,
// class traits, class charT, class ST, class SA>
// 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);
#include <regex>
#include <cassert>
#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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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"));
}
}

View File

@ -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.
//
//===----------------------------------------------------------------------===//
// <regex>
// template <class OutputIterator, class BidirectionalIterator,
// class traits, class charT, class ST, class SA>
// 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);
#include <regex>
#include <cassert>
#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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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<char*> Out;
typedef bidirectional_iterator<const char*> 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"));
}
}

View File

@ -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.
//
//===----------------------------------------------------------------------===//
// <regex>
// template <class traits, class charT, class ST, class SA, class FST, class FSA>>
// 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);
#include <regex>
#include <cassert>
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");
}
}

View File

@ -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.
//
//===----------------------------------------------------------------------===//
// <regex>
// template <class traits, class charT, class ST, class SA>
// 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);
#include <regex>
#include <cassert>
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");
}
}

View File

@ -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.
//
//===----------------------------------------------------------------------===//
// <regex>
// template <class traits, class charT, class ST, class SA>
// 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);
#include <regex>
#include <cassert>
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");
}
}

View File

@ -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.
//
//===----------------------------------------------------------------------===//
// <regex>
// template <class traits, class charT>
// 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);
#include <regex>
#include <cassert>
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");
}
}

View File

@ -41,4 +41,4 @@ int main()
++i;
assert(i == std::cregex_iterator());
}
}
}

View File

@ -61,4 +61,4 @@ int main()
++i;
assert(i == std::cregex_token_iterator());
}
}
}

View File

@ -29,4 +29,4 @@ int main()
{
test<char>();
test<wchar_t>();
}
}

View File

@ -61,4 +61,4 @@ int main()
assert(i == std::cregex_token_iterator());
}
#endif
}
}

View File

@ -72,4 +72,4 @@ int main()
++i;
assert(i == std::cregex_token_iterator());
}
}
}

View File

@ -125,4 +125,4 @@ int main()
++i;
assert(i == std::cregex_token_iterator());
}
}
}

View File

@ -33,4 +33,4 @@ int main()
assert(!(i2 == i));
assert(i2 != i);
}
}
}

View File

@ -69,4 +69,4 @@ int main()
++i;
assert(i == std::cregex_token_iterator());
}
}
}

View File

@ -69,4 +69,4 @@ int main()
i++;
assert(i == std::cregex_token_iterator());
}
}
}