Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions regex.cpp
Original file line number Diff line number Diff line change
@@ -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') } }
};

47 changes: 15 additions & 32 deletions regex.h
Original file line number Diff line number Diff line change
Expand Up @@ -1453,38 +1453,6 @@ class regex
mutable std::unique_ptr<context> 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)
Expand Down Expand Up @@ -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