From 079d7d9267f660f98cd83f035e9be2e0574bd510 Mon Sep 17 00:00:00 2001 From: Ian Clarkson Date: Sun, 16 Oct 2016 14:48:30 -0400 Subject: [PATCH 1/3] Adding basic support for regex_replace --- regex.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/regex.h b/regex.h index 0f29ad7..e91c647 100644 --- a/regex.h +++ b/regex.h @@ -1548,6 +1548,21 @@ inline auto regex_search_all(const std::string &re, return regex_search_all(r, begin, end); } +inline void regex_replace(std::string &str, const regex &re, const std::string &rep) +{ + match_result res; + auto begin = str.c_str(); + auto end = begin + str.size(); + while (regex_search(re, begin, end, &res)) { + size_t pos = res.start_pos() - &str[0]; + size_t len = res.end_pos() - res.start_pos(); + + if (pos >= str.size()) return; + + str.replace(pos, len, rep); + } +} + } // namespace skl #endif // REGEX_H From 686ea1d0a7d32567a8761f910c1c2dbf90bd3567 Mon Sep 17 00:00:00 2001 From: Ian Clarkson Date: Fri, 18 Nov 2016 13:45:54 -0500 Subject: [PATCH 2/3] Trying to fix multiply defined symbols by moving static variables into .cpp file --- regex.cpp | 34 ++++++++++++++++++++++++++++++++++ regex.h | 32 -------------------------------- 2 files changed, 34 insertions(+), 32 deletions(-) create mode 100644 regex.cpp diff --git a/regex.cpp b/regex.cpp new file mode 100644 index 0000000..807fd70 --- /dev/null +++ b/regex.cpp @@ -0,0 +1,34 @@ +#include "regex.h" + +// static +const int regex::state_of_begin_; + +// static regex::char_classes_ +regex::char_classes regex::char_classes_ = +{ + { "alnum", { char_range('A', 'Z'), char_range('a', 'z'), char_range('0', '9') } }, + { "alpha", { char_range('A', 'Z'), char_range('a', 'z') } }, + { "blank", { char_range(' '), char_range('\t') } }, + { "cntrl", { char_range(0x0, 0x1F), char_range(0x7F) } }, + { "digit", { char_range('0', '9') } }, + { "graph", { char_range(0x21, 0x7E) } }, + { "lower", { char_range('a', 'z') } }, + { "print", { char_range(0x20, 0x7E) } }, + { "punct", { char_range(']'), char_range('['), char_range('!'), + char_range('"'), char_range('#'), char_range('$'), + char_range('%'), char_range('&'), char_range('\''), + char_range('('), char_range(')'), char_range('*'), + char_range('+'), char_range(','), char_range('.'), + char_range('/'), char_range(':'), char_range(';'), + char_range('<'), char_range('='), char_range('>'), + char_range('?'), char_range('@'), char_range('\\'), + char_range('^'), char_range('_'), char_range('`'), + char_range('{'), char_range('|'), char_range('}'), + char_range('~'), char_range('-') } }, + { "space", { char_range(' '), char_range('\t'), char_range('\r'), + char_range('\n'), char_range('\v'), char_range('\f') } }, + { "upper", { char_range('A', 'Z') } }, + { "word", { char_range('A', 'Z'), char_range('a', 'z'), char_range('0', '9'), char_range('_') } }, + { "xdigit", { char_range('A', 'F'), char_range('a', 'f'), char_range('0', '9') } } +}; + diff --git a/regex.h b/regex.h index e91c647..02562fb 100644 --- a/regex.h +++ b/regex.h @@ -1453,38 +1453,6 @@ class regex mutable std::unique_ptr context_; }; -// static -const int regex::state_of_begin_; - -// static regex::char_classes_ -regex::char_classes regex::char_classes_ = -{ - { "alnum", { char_range('A', 'Z'), char_range('a', 'z'), char_range('0', '9') } }, - { "alpha", { char_range('A', 'Z'), char_range('a', 'z') } }, - { "blank", { char_range(' '), char_range('\t') } }, - { "cntrl", { char_range(0x0, 0x1F), char_range(0x7F) } }, - { "digit", { char_range('0', '9') } }, - { "graph", { char_range(0x21, 0x7E) } }, - { "lower", { char_range('a', 'z') } }, - { "print", { char_range(0x20, 0x7E) } }, - { "punct", { char_range(']'), char_range('['), char_range('!'), - char_range('"'), char_range('#'), char_range('$'), - char_range('%'), char_range('&'), char_range('\''), - char_range('('), char_range(')'), char_range('*'), - char_range('+'), char_range(','), char_range('.'), - char_range('/'), char_range(':'), char_range(';'), - char_range('<'), char_range('='), char_range('>'), - char_range('?'), char_range('@'), char_range('\\'), - char_range('^'), char_range('_'), char_range('`'), - char_range('{'), char_range('|'), char_range('}'), - char_range('~'), char_range('-') } }, - { "space", { char_range(' '), char_range('\t'), char_range('\r'), - char_range('\n'), char_range('\v'), char_range('\f') } }, - { "upper", { char_range('A', 'Z') } }, - { "word", { char_range('A', 'Z'), char_range('a', 'z'), char_range('0', '9'), char_range('_') } }, - { "xdigit", { char_range('A', 'F'), char_range('a', 'f'), char_range('0', '9') } } -}; - // Helper functions inline bool regex_match(const regex &re, const std::string &str, match_result *match_res = nullptr) From 34ac84460027e59dce9a818f75cc74e2bb12fc1c Mon Sep 17 00:00:00 2001 From: Ian Clarkson Date: Fri, 18 Nov 2016 14:22:43 -0500 Subject: [PATCH 3/3] Fixing compile issues in new separate cpp file for regex --- regex.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regex.cpp b/regex.cpp index 807fd70..f719324 100644 --- a/regex.cpp +++ b/regex.cpp @@ -1,10 +1,10 @@ #include "regex.h" // static -const int regex::state_of_begin_; +const int skl::regex::state_of_begin_; // static regex::char_classes_ -regex::char_classes regex::char_classes_ = +skl::regex::char_classes skl::regex::char_classes_ = { { "alnum", { char_range('A', 'Z'), char_range('a', 'z'), char_range('0', '9') } }, { "alpha", { char_range('A', 'Z'), char_range('a', 'z') } },