| | #pragma once
|
| |
|
| | #include <regex>
|
| | #include <string>
|
| |
|
| | enum common_regex_match_type {
|
| | COMMON_REGEX_MATCH_TYPE_NONE,
|
| | COMMON_REGEX_MATCH_TYPE_PARTIAL,
|
| | COMMON_REGEX_MATCH_TYPE_FULL,
|
| | };
|
| |
|
| | struct common_string_range {
|
| | size_t begin;
|
| | size_t end;
|
| | common_string_range(size_t begin, size_t end) : begin(begin), end(end) {
|
| | if (begin > end) {
|
| | throw std::runtime_error("Invalid range");
|
| | }
|
| | }
|
| |
|
| | common_string_range() = delete;
|
| | bool empty() const {
|
| | return begin == end;
|
| | }
|
| | bool operator==(const common_string_range & other) const {
|
| | return begin == other.begin && end == other.end;
|
| | }
|
| | };
|
| |
|
| | struct common_regex_match {
|
| | common_regex_match_type type = COMMON_REGEX_MATCH_TYPE_NONE;
|
| | std::vector<common_string_range> groups;
|
| |
|
| | bool operator==(const common_regex_match & other) const {
|
| | return type == other.type && groups == other.groups;
|
| | }
|
| | bool operator!=(const common_regex_match & other) const {
|
| | return !(*this == other);
|
| | }
|
| | };
|
| |
|
| | class common_regex {
|
| | std::string pattern;
|
| | std::regex rx;
|
| | std::regex rx_reversed_partial;
|
| |
|
| | public:
|
| | explicit common_regex(const std::string & pattern);
|
| |
|
| | common_regex_match search(const std::string & input, size_t pos, bool as_match = false) const;
|
| |
|
| | const std::string & str() const { return pattern; }
|
| | };
|
| |
|
| |
|
| | std::string regex_to_reversed_partial_regex(const std::string & pattern);
|
| |
|