1#ifndef NEFORCE_CORE_STRING_REGEX_HPP__
2#define NEFORCE_CORE_STRING_REGEX_HPP__
18NEFORCE_BEGIN_NAMESPACE__
30struct regex_exception final : value_exception {
31 explicit regex_exception(
const char* info =
"Regex Operation Failed") noexcept :
32 value_exception(info) {}
34 explicit regex_exception(
const exception& e) :
37 ~regex_exception()
override =
default;
39 NEFORCE_NODISCARD
const char*
type() const noexcept
override {
return "regex_exception"; }
95 NEFORCE_NODISCARD
size_t position() const noexcept {
return position_; }
101 NEFORCE_NODISCARD
size_t length() const noexcept {
return length_; }
113 NEFORCE_NODISCARD
size_t size() const noexcept {
return groups_.size(); }
121 return idx < groups_.size() ? groups_[idx].view() :
"";
144 return matched() ? subject_.view(position_ + length_) :
"";
166 NEFORCE_NODISCARD
iterator begin() const noexcept {
return groups_.begin(); }
172 NEFORCE_NODISCARD
iterator end() const noexcept {
return groups_.end(); }
176class NEFORCE_API regex_iterator;
178class NEFORCE_API regex_token_iterator;
189 struct pcre2_code_deleter {
190 void operator()(::pcre2_code* code)
const noexcept {
191 if (code !=
nullptr) {
192 ::pcre2_code_free(code);
200 int capture_count_ = 0;
202 friend class regex_iterator;
203 friend class regex_token_iterator;
208 match_result do_match(::PCRE2_SPTR subject,
size_t length,
size_t start_offset,
uint32_t options,
209 const string& subject_str)
const;
252 NEFORCE_NODISCARD
bool match(
const string& str)
const;
306 NEFORCE_NODISCARD
int capture_count() const noexcept {
return capture_count_; }
312 NEFORCE_NODISCARD
const string&
pattern() const noexcept {
return pattern_; }
318 NEFORCE_NODISCARD
bool valid() const noexcept {
return code_ !=
nullptr; }
325 NEFORCE_NODISCARD regex_iterator
begin(
const string& str)
const;
332 NEFORCE_NODISCARD regex_iterator
end(
const string& str)
const;
350 const regex* regex_ =
nullptr;
354 size_t next_pos_ = 0;
459 const regex* regex_ =
nullptr;
465 state state_ = state::END;
466 size_t last_pos_ = 0;
523inline regex_iterator regex::begin(
const string& str)
const {
return regex_iterator::begin(
this, str); }
525inline regex_iterator regex::end(
const string& str)
const {
return regex_iterator::end(
this, str); }
530NEFORCE_END_NAMESPACE__
constexpr basic_string_view view(const size_type off, const size_type count=npos) const
获取子视图
static constexpr size_type npos
iterator begin() const noexcept
格式化替换结果
match_result(string subject, size_t pos, size_t len, const vector< string > &groups, vector< pair< size_t, size_t > > group_positions)
构造函数
iterator end() const noexcept
获取捕获组迭代器结束位置
pair< size_t, size_t > position(const size_t idx) const noexcept
获取指定捕获组的位置信息
string_view data() const noexcept
获取完整匹配的文本
bool matched() const noexcept
检查是否匹配成功
string_view suffix() const noexcept
获取匹配后的后缀
size_t length() const noexcept
获取匹配长度
string_view operator[](const size_t idx) const noexcept
获取指定捕获组
size_t size() const noexcept
获取捕获组数量
string_view prefix() const noexcept
获取匹配前的前缀
match_result()=default
默认构造函数
size_t position() const noexcept
获取匹配起始位置
vector< string >::const_iterator iterator
捕获组迭代器类型
forward_iterator_tag iterator_category
迭代器类型
regex_iterator(const regex *re, string str, size_t pos=0)
构造函数
const match_result * pointer
指针类型
ptrdiff_t difference_type
差值类型
match_result value_type
元素类型
pointer operator->() const noexcept
成员访问操作符
const match_result & reference
引用类型
regex_iterator operator++(int)
后置递增操作符
regex_iterator()=default
默认构造函数,构造结束迭代器
static regex_iterator end(const regex *re, const string &str)
获取结束迭代器
bool operator==(const regex_iterator &other) const noexcept
相等比较操作符
static regex_iterator begin(const regex *re, const string &str)
获取起始迭代器
regex_iterator & operator++()
前置递增操作符
bool operator!=(const regex_iterator &other) const noexcept
不等比较操作符
reference operator*() const noexcept
解引用操作符
bool operator==(const regex_token_iterator &other) const noexcept
相等比较操作符
string_view operator*() const noexcept
解引用操作符
regex_token_iterator(const regex *re, string str, int index=0)
构造函数
regex_token_iterator()=default
默认构造函数
bool operator!=(const regex_token_iterator &other) const noexcept
不等比较操作符
regex_token_iterator & operator++()
前置递增操作符
regex_token_iterator operator++(int)
后置递增操作符
string replace_first(const string &str, string_view fmt) const
替换第一个匹配
regex_iterator begin(const string &str) const
获取匹配结果迭代器起始位置
int capture_count() const noexcept
获取捕获组数量
vector< string > split(const string &str, int max_splits=-1) const
使用正则表达式分割字符串
vector< match_result > find_all(const string &str) const
查找所有匹配
bool match(const string &str) const
检查是否完全匹配
string replace_all(const string &str, string_view fmt) const
替换所有匹配
string replace_all_callback(const string &str, function< string(const match_result &)> callback) const
使用回调函数替换所有匹配
regex(const regex &other)
拷贝构造函数
bool valid() const noexcept
检查正则表达式是否有效
regex_iterator end(const string &str) const
获取匹配结果迭代器结束位置
match_result do_match(const string &str) const
执行完整匹配
regex & operator=(const regex &other)
拷贝赋值运算符
match_result search(const string &str, size_t pos=0) const
在字符串中搜索第一个匹配
const string & pattern() const noexcept
获取正则表达式模式
regex(const string &pattern, uint32_t options=0)
从字符串构造正则表达式
vector_iterator< true, vector< T, Alloc > > const_iterator
常量迭代器类型
unsigned int uint32_t
32位无符号整数类型
basic_string_view< char > string_view
字符字符串视图
const char * type() const noexcept override
获取异常类型