C++ 正则表达式库 std::basic_regex 中文手册(API说明来自cppreference.com)

简介: C++ 正则表达式库 std::basic_regex 中文手册(API说明来自cppreference.com)

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 对象的内容,设置了区域信息,并获取了标记子表达式的数量和语法标志。

目录
相关文章
|
6天前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
19 6
|
6天前
|
安全 C++
超级好用的C++实用库之环形内存池
超级好用的C++实用库之环形内存池
23 5
|
6天前
|
缓存 网络协议 Linux
超级好用的C++实用库之套接字
超级好用的C++实用库之套接字
19 1
|
6天前
|
存储 算法 安全
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
12 1
|
6天前
|
存储 算法 安全
超级好用的C++实用库之国密sm4算法
超级好用的C++实用库之国密sm4算法
16 0
|
6天前
|
网络协议 Linux C++
超级好用的C++实用库之网络
超级好用的C++实用库之网络
17 0
|
6天前
|
算法 安全 Serverless
超级好用的C++实用库之国密sm3算法
超级好用的C++实用库之国密sm3算法
13 0
|
6天前
|
算法 数据安全/隐私保护 C++
超级好用的C++实用库之MD5信息摘要算法
超级好用的C++实用库之MD5信息摘要算法
14 0
|
6天前
|
监控 Linux API
超级好用的C++实用库之服务包装类
超级好用的C++实用库之服务包装类
|
6天前
|
存储 运维 监控
超级好用的C++实用库之日志类
超级好用的C++实用库之日志类
13 0