11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
19PROMEKI_NAMESPACE_BEGIN
47 using Flag = std::regex_constants::syntax_option_type;
50 static constexpr Flag IgnoreCase = std::regex::icase;
53 static constexpr Flag NoSubs = std::regex::nosubs;
56 static constexpr Flag Optimize = std::regex::optimize;
59 static constexpr Flag Collate = std::regex::collate;
62 static constexpr Flag ECMAScript = std::regex::ECMAScript;
65 static constexpr Flag Basic = std::regex::basic;
68 static constexpr Flag Extended = std::regex::extended;
71 static constexpr Flag Awk = std::regex::awk;
74 static constexpr Flag Grep = std::regex::grep;
77 static constexpr Flag EGrep = std::regex::egrep;
80 static constexpr Flag DefaultFlags = ECMAScript | Optimize;
83 RegEx() : _valid(false) {}
95 RegEx(
const String &pattern, Flag flags = DefaultFlags) : p(pattern) {
97 d.assign(pattern.cstr(), flags);
99 }
catch (
const std::regex_error &) {
114 RegEx(
const char *pattern, Flag flags = DefaultFlags) : p(pattern) {
116 d.assign(pattern, flags);
118 }
catch (
const std::regex_error &) {
131 static Result<RegEx> compile(
const String &pattern, Flag flags = DefaultFlags) {
134 re.d.assign(pattern.cstr(), flags);
137 }
catch (
const std::regex_error &) {
138 return makeError<RegEx>(Error::Invalid);
140 return makeResult(std::move(re));
152 RegEx &operator=(
const String &pattern) {
155 d.assign(pattern.cstr());
157 }
catch (
const std::regex_error &) {
164 bool isValid()
const {
return _valid; }
170 String pattern()
const {
return p; }
178 bool match(
const String &str)
const {
179 if (!_valid)
return false;
181 return std::regex_match(str.str(), m, d);
190 bool search(
const String &str)
const {
191 if (!_valid)
return false;
192 return std::regex_search(str.str(), d);
201 StringList matches(
const String &str)
const {
203 if (!_valid)
return matches;
205 const std::string &s = str.str();
206 auto pos = s.cbegin();
207 while (std::regex_search(pos, s.cend(), match, d)) {
208 matches += match.str();
209 pos = match.suffix().first;