diff --git a/regex.cpp b/regex.cpp new file mode 100644 index 0000000..f719324 --- /dev/null +++ b/regex.cpp @@ -0,0 +1,34 @@ +#include "regex.h" + +// static +const int skl::regex::state_of_begin_; + +// static 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') } }, + { "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 0f29ad7..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) @@ -1548,6 +1516,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