C++ 正则表达式库 std::basic_regex
在头文件 中定义了模板类
basic_regex
,它为容纳正则表达式提供了一个通用的框架。
template < class CharT, class Traits = std::regex_traits<CharT> > class basic_regex;
(自 C++11 起)
对于常见的字符类型,提供了几个类型定义:
在头文件 中定义
类型 | 定义 |
std::regex | std::basic_regex |
std::wregex | std::basic_regex<wchar_t> |
成员类型
成员类型 | 定义 |
value_type | CharT |
traits_type | Traits |
string_type | Traits::string_type |
locale_type | Traits::locale_type |
flag_type | std::regex_constants::syntax_option_type |
成员函数
- 构造函数:构造正则表达式对象
- 析构函数:销毁正则表达式对象
- operator=:赋值内容
- assign:赋值内容
观察者
- mark_count:返回正则表达式中标记的子表达式的数量
- flags:返回语法标志
区域设置
- getloc:获取区域信息
- imbue:设置区域信息
修改器
- swap:交换内容
常量
值 | 效果 |
icase | 字符匹配应忽略大小写 |
nosubs | 在执行匹配时,所有标记的子表达式(expr)都被视为非标记子表达式(?:expr)。在提供的 std::regex_match 结构中不存储匹配项,mark_count() 为零 |
optimize | 指示正则表达式引擎加快匹配速度,可能会使构造变慢。例如,这可能意味着将非确定性有限状态自动机转换为确定性有限状态自动机 |
collate | “[a-b]” 形式的字符范围将受区域设置影响 |
multiline (C++17) | 如果选择了 ECMAScript 引擎,^ 应匹配一行的开头,$ 应匹配一行的末尾 |
ECMAScript | 使用修改后的 ECMAScript 正则表达式语法 |
basic | 使用基本的 POSIX 正则表达式语法 |
extended | 使用扩展的 POSIX 正则表达式语法 |
awk | 使用 POSIX 中的 awk 实用程序使用的正则表达式语法 |
grep | 使用 POSIX 中的 grep 实用程序使用的正则表达式语法。这与 basic 选项基本相同,但新增了 newline ‘\n’ 作为 alternation 分隔符 |
egrep | 使用带有 -E 选项的 POSIX 中的 grep 实用程序使用的正则表达式语法。这与 extended 选项基本相同,但新增了 newline ‘\n’ 和 ’ |
在 ECMAScript、basic、extended、awk、grep、egrep 中最多只能选择一个语法选项。如果没有选择语法,那么默认会选择 ECMAScript。其他选项作为修饰符,例如 std::regex("meow", std::regex::icase)
等价于 std::regex("meow", std::regex::ECMAScript|std::regex::icase)
。
在 basic_regex 中的成员常量是 namespace std::regex_constants 中定义的 syntax_option_type 常量的复制。
非成员函数
- std::swap(std::basic_regex):专门化 std::swap 算法
以下是一个包含了各种用法的代码示例:
#include <regex> #include <string> #include <iostream> int main() { // 创建一个 std::regex 对象 std::regex reg("hello"); // 使用 std::regex 对象进行匹配 std::string s = "hello world"; std::smatch m; if (std::regex_search(s, m, reg)) { std::cout << "Match found: " << m.str() << std::endl; } // 使用 assign() 修改 regex 对象的内容 reg.assign("world"); if (std::regex_search(s, m, reg)) { std::cout << "Match found: " << m.str() << std::endl; } // 使用 swap() 交换两个 regex 对象的内容 std::regex reg2("goodbye"); reg.swap(reg2); // 使用 imbue() 设置区域信息 std::locale loc("C"); reg.imbue(loc); // 使用 mark_count() 获取正则表达式中标记的子表达式数量 std::cout << "Mark count: " << reg.mark_count() << std::endl; // 使用 flags() 获取语法标志 std::cout << "Flags: " << reg.flags() << std::endl; return 0; }
在这个示例中,我们创建了一个 std::regex 对象,然后使用它对字符串进行了匹配。我们还修改了 regex 对象的内容,交换了两个 regex 对象的内容,设置了区域信息,并获取了标记子表达式的数量和语法标志。