From 96ccbbd113efbfe6a0a300a1971e4a6f12c9249c Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Sat, 19 Nov 2016 00:31:40 +0300 Subject: Add support for Perl regex escape sequences subset to C++11-based implementation --- tests/re/buildfile | 1 - tests/re/driver.cxx | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) (limited to 'tests/re') diff --git a/tests/re/buildfile b/tests/re/buildfile index d31eb62..80d077a 100644 --- a/tests/re/buildfile +++ b/tests/re/buildfile @@ -5,4 +5,3 @@ import libs = libcutl%lib{cutl} exe{driver}: cxx{driver} $libs -exe{driver}: test = false # @@ TMP, fails. diff --git a/tests/re/driver.cxx b/tests/re/driver.cxx index 4b070dd..c8b06d2 100644 --- a/tests/re/driver.cxx +++ b/tests/re/driver.cxx @@ -51,6 +51,84 @@ main () assert (r.replace ("'foofoxbar'", "\\u$1") == "Fox"); } + // replace() using escape sequences. + // + { + regex r ("([aA][bB][cC])"); + + // $-based escape sequences. + // + assert (r.replace ("xabcyz", "v$") == "xv$yz"); + assert (r.replace ("xabcyz", "v$d") == "xv$dyz"); + assert (r.replace ("xabcyz", "v$1d") == "xvabcdyz"); + assert (r.replace ("xabcyabcz", "v$2d") == "xvdyvdz"); + assert (r.replace ("xabcyz", "v$&d") == "xvabcdyz"); + assert (r.replace ("xabcyz", "$`$$$\'") == "xx$yzyz"); + + { + regex r ("(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)"); + + assert (r.replace ("xabcdefghijy", "$10$9$8$7$6$5$4$3$2$1") == + "xjihgfedcbay"); + } + + // \-based escape sequences. + // + assert (r.replace ("xabcyz", "v\\d") == "xvdyz"); + assert (r.replace ("xabcyz", "v\\1d") == "xvabcdyz"); + assert (r.replace ("xabcyabcz", "v\\2d") == "xvdyvdz"); + assert (r.replace ("xabcyz", "v\\\\d") == "xv\\dyz"); + assert (r.replace ("xabcyz", "v\\$d") == "xv$dyz"); + + { + regex r ("(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)"); + + assert (r.replace ("xabcdefghijy", "\\10\\9\\8\\7\\6\\5\\4\\3\\2\\1") == + "xa0ihgfedcbay"); + } + + assert (r.replace ("xabcyz", "\\u") == "xyz"); + assert (r.replace ("xabcyz", "\\uv") == "xVyz"); + assert (r.replace ("xabcyz", "\\u\\1") == "xAbcyz"); + assert (r.replace ("xabcyz", "\\lV") == "xvyz"); + assert (r.replace ("xAbcyz", "\\l\\1") == "xabcyz"); + + assert (r.replace ("xabcyz", "\\U") == "xyz"); + assert (r.replace ("xabcyz", "\\Uv") == "xVyz"); + assert (r.replace ("xabcyz", "\\U\\1v") == "xABCVyz"); + assert (r.replace ("xabcyz", "\\U\\1\\Ev") == "xABCvyz"); + + assert (r.replace ("xabcyz", "\\L") == "xyz"); + assert (r.replace ("xabcyz", "\\LV") == "xvyz"); + assert (r.replace ("xABCyz", "\\L\\1V") == "xabcvyz"); + assert (r.replace ("xabcyz", "\\L\\1\\EV") == "xabcVyz"); + + assert (r.replace ("xabcyz", "\\Uv\\LV") == "xVvyz"); + assert (r.replace ("xabcyz", "\\U\\1\\LV") == "xABCvyz"); + + { + regex r ("(b?)-"); + assert (r.replace ("a-b-", "\\u\\1x") == "aXBx"); + } + } + + // wregex::replace(). + // + { + { + wregex r (L"['`]foo([^ ]*)bar['`]"); + assert (r.replace (L"'foofoxbar'", L"\\u$1") == L"Fox"); + } +/* + { + std::locale::global (std::locale ("en_US.utf8")); + + wregex r (L"(a)"); + assert (r.replace (L"a", L"\\l\u0190") == L"\u025b"); + } +*/ + } + // regexsub // { @@ -71,12 +149,12 @@ main () // try { - regexsub r ("/['`]foo([^ ]*)bar['`]#\\u$1/"); + regexsub r ("/['`]foo([^ ]*)bar['`]#$1/"); assert (false); } catch (format const& e) { - assert (e.regex () == "/['`]foo([^ ]*)bar['`]#\\u$1/"); + assert (e.regex () == "/['`]foo([^ ]*)bar['`]#$1/"); assert (!e.description ().empty ()); //std::cerr << e.description () << std::endl; } -- cgit v1.1