NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
regex.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_STRING_REGEX_HPP__
2#define NEFORCE_CORE_STRING_REGEX_HPP__
3
12
13#include <pcre2.h>
18NEFORCE_BEGIN_NAMESPACE__
19
25
30struct regex_exception final : value_exception {
31 explicit regex_exception(const char* info = "Regex Operation Failed", const char* type = static_type,
32 const int code = 0) noexcept :
33 value_exception(info, type, code) {}
34
35 explicit regex_exception(const exception& e) :
36 value_exception(e) {}
37
38 ~regex_exception() override = default;
39
40 static constexpr auto static_type = "regex_exception";
41};
42 // Exceptions
44
50
58class NEFORCE_API match_result {
59public:
61
62private:
63 vector<string> groups_;
64 vector<pair<size_t, size_t>> group_positions_;
65 size_t position_ = string::npos;
66 size_t length_ = 0;
67 string subject_;
68
69public:
73 match_result() = default;
74
83 match_result(string subject, size_t pos, size_t len, const vector<string>& groups,
84 vector<pair<size_t, size_t>> group_positions);
85
90 NEFORCE_NODISCARD bool matched() const noexcept { return position_ != string::npos; }
91
96 NEFORCE_NODISCARD size_t position() const noexcept { return position_; }
97
102 NEFORCE_NODISCARD size_t length() const noexcept { return length_; }
103
108 NEFORCE_NODISCARD string_view data() const noexcept { return matched() ? groups_[0].view() : ""; }
109
114 NEFORCE_NODISCARD size_t size() const noexcept { return groups_.size(); }
115
121 NEFORCE_NODISCARD string_view operator[](const size_t idx) const noexcept {
122 return idx < groups_.size() ? groups_[idx].view() : "";
123 }
124
130 NEFORCE_NODISCARD pair<size_t, size_t> position(const size_t idx) const noexcept {
131 return idx < group_positions_.size() ? group_positions_[idx] : pair<size_t, size_t>{string::npos, 0};
132 }
133
138 NEFORCE_NODISCARD string_view prefix() const noexcept { return matched() ? subject_.view(0, position_) : ""; }
139
144 NEFORCE_NODISCARD string_view suffix() const noexcept {
145 return matched() ? subject_.view(position_ + length_) : "";
146 }
147
161 NEFORCE_NODISCARD string format(string_view fmt) const;
162
167 NEFORCE_NODISCARD iterator begin() const noexcept { return groups_.begin(); }
168
173 NEFORCE_NODISCARD iterator end() const noexcept { return groups_.end(); }
174};
175
176
177class NEFORCE_API regex_iterator;
178
179class NEFORCE_API regex_token_iterator;
180
188class NEFORCE_API regex {
189private:
190 struct pcre2_code_deleter {
191 void operator()(pcre2_code* code) const noexcept {
192 if (code) {
193 pcre2_code_free(code);
194 }
195 }
196 };
197
198 struct pcre2_match_data_deleter {
199 void operator()(pcre2_match_data* data) const noexcept {
200 if (data) {
201 pcre2_match_data_free(data);
202 }
203 }
204 };
205
207 string pattern_;
208 uint32_t options_;
209 int capture_count_ = 0;
210
211 friend class regex_iterator;
212 friend class regex_token_iterator;
213
214private:
215 void compile(const string& pattern, uint32_t options = 0);
216
217 match_result do_match(PCRE2_SPTR subject, size_t length, size_t start_offset, uint32_t options,
218 const string& subject_str) const;
219
220public:
227 explicit regex(const string& pattern, uint32_t options = 0);
228
229 regex(regex&& other) noexcept;
230 regex& operator=(regex&& other) noexcept;
231
232 regex(const regex&) = delete;
233 regex& operator=(const regex&) = delete;
234
242 NEFORCE_NODISCARD match_result do_match(const string& str) const;
243
249 NEFORCE_NODISCARD bool match(const string& str) const;
250
257 NEFORCE_NODISCARD match_result search(const string& str, size_t pos = 0) const;
258
264 NEFORCE_NODISCARD vector<match_result> find_all(const string& str) const;
265
272 string replace_first(const string& str, string_view fmt) const;
273
280 string replace_all(const string& str, string_view fmt) const;
281
288 string replace_all_callback(const string& str, function<string(const match_result&)> callback) const;
289
296 NEFORCE_NODISCARD vector<string> split(const string& str, int max_splits = -1) const;
297
302 NEFORCE_NODISCARD int capture_count() const noexcept { return capture_count_; }
303
308 NEFORCE_NODISCARD const string& pattern() const noexcept { return pattern_; }
309
314 NEFORCE_NODISCARD bool valid() const noexcept { return code_ != nullptr; }
315
321 NEFORCE_NODISCARD regex_iterator begin(const string& str) const;
322
328 NEFORCE_NODISCARD regex_iterator end(const string& str) const;
329};
330
338class NEFORCE_API regex_iterator {
339public:
343 using pointer = const match_result*;
344 using reference = const match_result&;
345
346private:
347 const regex* regex_ = nullptr;
348 string subject_;
349
350 mutable vector<match_result> cached_matches_;
351 mutable bool cache_built_ = false;
352
353 mutable ptrdiff_t current_index_ = -1;
354
355 void build_cache() const;
356
357 void move_next();
358 void move_previous();
359
360 void find_from_position(size_t pos) const;
361 void find_last_before_position(size_t pos);
362
363public:
367 regex_iterator() = default;
368
375 regex_iterator(const regex* re, string str, size_t pos = 0);
376
384 static regex_iterator from_index(const regex* re, const string& str, ptrdiff_t index);
385
390 NEFORCE_NODISCARD reference operator*() const;
391
396 NEFORCE_NODISCARD pointer operator->() const { return &(operator*()); }
397
403 move_next();
404 return *this;
405 }
406
412 regex_iterator tmp = *this;
413 ++(*this);
414 return tmp;
415 }
416
422 if (current_index_ == -1 && cache_built_) {
423 if (!cached_matches_.empty()) {
424 current_index_ = static_cast<ptrdiff_t>(cached_matches_.size()) - 1;
425 }
426 } else {
427 move_previous();
428 }
429 return *this;
430 }
431
437 regex_iterator tmp = *this;
438 --(*this);
439 return tmp;
440 }
441
447 NEFORCE_NODISCARD bool operator==(const regex_iterator& other) const noexcept;
448
454 NEFORCE_NODISCARD bool operator!=(const regex_iterator& other) const noexcept { return !(*this == other); }
455
462 static regex_iterator begin(const regex* re, const string& str) { return regex_iterator(re, str, 0); }
463
470 static regex_iterator end(const regex* re, const string& str) {
472 it.regex_ = re;
473 it.subject_ = str;
474 if (re) {
475 it.build_cache();
476 it.current_index_ = -1;
477 }
478 return it;
479 }
480};
481
489class NEFORCE_API regex_token_iterator {
490public:
495 enum class state {
496 BEFORE_FIRST,
497 BETWEEN_MATCHES,
498 AFTER_LAST,
500 };
501
502private:
503 const regex* regex_ = nullptr;
504 string subject_;
505 regex_iterator match_iterator_;
506 regex_iterator end_iterator_;
507 string_view current_;
508 int index_ = 0;
509 state state_ = state::END;
510 size_t last_pos_ = 0;
511
512private:
513 void find_next();
514
515public:
520
527 regex_token_iterator(const regex* re, string str, int index = 0);
528
533 NEFORCE_NODISCARD string operator*() const noexcept { return current_; }
534
540
546 regex_token_iterator tmp = *this;
547 ++(*this);
548 return tmp;
549 }
550
556 NEFORCE_NODISCARD bool operator==(const regex_token_iterator& other) const noexcept;
557
563 NEFORCE_NODISCARD bool operator!=(const regex_token_iterator& other) const noexcept { return !(*this == other); }
564};
565
567inline regex_iterator regex::begin(const string& str) const { return regex_iterator::begin(this, str); }
568
569inline regex_iterator regex::end(const string& str) const { return regex_iterator::end(this, str); }
571 // Regex
573
574NEFORCE_END_NAMESPACE__
575#endif // NEFORCE_CORE_STRING_REGEX_HPP__
static constexpr size_type npos
函数包装器主模板声明
正则表达式匹配结果类
NEFORCE_NODISCARD string_view suffix() const noexcept
获取匹配后的后缀
match_result()=default
默认构造函数
NEFORCE_NODISCARD bool matched() const noexcept
检查是否匹配成功
vector< string >::const_iterator iterator
捕获组迭代器类型
NEFORCE_NODISCARD pair< size_t, size_t > position(const size_t idx) const noexcept
获取指定捕获组的位置信息
NEFORCE_NODISCARD string_view data() const noexcept
获取完整匹配的文本
NEFORCE_NODISCARD string_view prefix() const noexcept
获取匹配前的前缀
NEFORCE_NODISCARD size_t size() const noexcept
获取捕获组数量
NEFORCE_NODISCARD iterator begin() const noexcept
格式化替换结果
NEFORCE_NODISCARD size_t position() const noexcept
获取匹配起始位置
match_result(string subject, size_t pos, size_t len, const vector< string > &groups, vector< pair< size_t, size_t > > group_positions)
构造函数
NEFORCE_NODISCARD iterator end() const noexcept
获取捕获组迭代器结束位置
NEFORCE_NODISCARD string_view operator[](const size_t idx) const noexcept
获取指定捕获组
NEFORCE_NODISCARD size_t length() const noexcept
获取匹配长度
正则表达式匹配迭代器
match_result value_type
元素类型
NEFORCE_NODISCARD pointer operator->() const
成员访问操作符
regex_iterator operator++(int)
后置递增操作符
NEFORCE_NODISCARD reference operator*() const
解引用操作符
bidirectional_iterator_tag iterator_category
迭代器类型
regex_iterator()=default
默认构造函数,构造结束迭代器
static regex_iterator from_index(const regex *re, const string &str, ptrdiff_t index)
从指定索引构造迭代器
NEFORCE_NODISCARD bool operator==(const regex_iterator &other) const noexcept
相等比较操作符
regex_iterator operator--(int)
后置递减操作符
ptrdiff_t difference_type
差值类型
static regex_iterator begin(const regex *re, const string &str)
获取起始迭代器
const match_result & reference
引用类型
regex_iterator(const regex *re, string str, size_t pos=0)
构造函数
NEFORCE_NODISCARD bool operator!=(const regex_iterator &other) const noexcept
不等比较操作符
regex_iterator & operator--()
前置递减操作符
const match_result * pointer
指针类型
regex_iterator & operator++()
前置递增操作符
static regex_iterator end(const regex *re, const string &str)
获取结束迭代器
正则表达式令牌迭代器
regex_token_iterator operator++(int)
后置递增操作符
regex_token_iterator(const regex *re, string str, int index=0)
构造函数
regex_token_iterator & operator++()
前置递增操作符
NEFORCE_NODISCARD bool operator!=(const regex_token_iterator &other) const noexcept
不等比较操作符
NEFORCE_NODISCARD string operator*() const noexcept
解引用操作符
state
迭代器状态枚举
NEFORCE_NODISCARD bool operator==(const regex_token_iterator &other) const noexcept
相等比较操作符
regex_token_iterator()=default
默认构造函数
正则表达式类
NEFORCE_NODISCARD bool match(const string &str) const
检查是否完全匹配
NEFORCE_NODISCARD regex_iterator end(const string &str) const
获取匹配结果迭代器结束位置
NEFORCE_NODISCARD match_result do_match(const string &str) const
执行完整匹配
NEFORCE_NODISCARD vector< match_result > find_all(const string &str) const
查找所有匹配
NEFORCE_NODISCARD const string & pattern() const noexcept
获取正则表达式模式
NEFORCE_NODISCARD regex_iterator begin(const string &str) const
获取匹配结果迭代器起始位置
regex(const string &pattern, uint32_t options=0)
从字符串构造正则表达式
string replace_first(const string &str, string_view fmt) const
替换第一个匹配
NEFORCE_NODISCARD bool valid() const noexcept
检查正则表达式是否有效
string replace_all_callback(const string &str, function< string(const match_result &)> callback) const
使用回调函数替换所有匹配
NEFORCE_NODISCARD match_result search(const string &str, size_t pos=0) const
在字符串中搜索第一个匹配
NEFORCE_NODISCARD int capture_count() const noexcept
获取捕获组数量
NEFORCE_NODISCARD vector< string > split(const string &str, int max_splits=-1) const
使用正则表达式分割字符串
string replace_all(const string &str, string_view fmt) const
替换所有匹配
独占智能指针
动态大小数组容器
vector_iterator< true, vector< T, Alloc > > const_iterator
常量迭代器类型
通用函数包装器
unsigned int uint32_t
32位无符号整数类型
constexpr duration< inner::__common_rep_t< Rep1, Rep2 >, Period > operator*(const duration< Rep1, Period > &value, const Rep2 &scalar)
乘法运算符(持续时间 * 标量)
@ END
从文件结尾开始
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string format(const string_view fmt, Args &&... args)
格式化字符串
int64_t ptrdiff_t
指针差类型
basic_string_view< char > string_view
字符字符串视图
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
字符串类型别名和实用函数
双向迭代器标签
exception(const char *info=static_type, const char *type=static_type, const int code=0)
构造函数
NEFORCE_NODISCARD int code() const noexcept
获取异常码
NEFORCE_NODISCARD const char * type() const noexcept
获取异常类型
存储两个值的元组对
独占智能指针
动态大小数组容器