Namespaces
Variants

Regular expressions library (since C++11)

From cppreference.net

正则表达式库提供了一个表示 正则表达式 的类,这是一种用于在字符串内执行模式匹配的微型语言。几乎所有涉及正则表达式的操作都可以通过处理以下若干对象来实现:

  • 目标序列 。被搜索模式的字符序列。这可以是由两个迭代器指定的范围、以空字符结尾的字符串或一个 std::string
  • 模式 。这是正则表达式本身。它决定了什么构成匹配。它是一个 std::basic_regex 类型的对象,通过具有特殊 语法 的字符串构造。
  • 替换字符串 。这是一个用于确定如何替换匹配项的字符串。

目录

正则表达式语法

模式和替换字符串支持以下正则表达式语法:

某些语法变体(例如不区分大小写的匹配)也可用,详见 此页面

主要类

这些类封装了一个正则表达式以及在目标字符序列中匹配正则表达式的结果。

正则表达式对象
(类模板)
(C++11)
标识子表达式匹配的字符序列
(类模板)
标识一个正则表达式匹配,包括所有子表达式匹配
(类模板)

算法

这些函数用于将封装在正则表达式中的模式应用于目标字符序列。

尝试将正则表达式与整个字符序列匹配
(函数模板)
尝试将正则表达式与字符序列的任意部分匹配
(函数模板)
使用格式化替换文本来替换正则表达式的匹配项
(函数模板)

迭代器

正则表达式迭代器用于遍历在序列中找到的整个正则表达式匹配集合。

遍历字符序列中的所有正则表达式匹配
(类模板)
遍历给定字符串中所有正则表达式匹配的指定子表达式,或遍历未匹配的子字符串
(类模板)

异常处理

此类定义了作为异常抛出的对象类型,用于报告正则表达式库中的错误。

报告正则表达式库生成的错误
(类)

特性

正则表达式特征类用于封装正则表达式的本地化特性。

提供正则表达式库所需的字符类型元信息
(类模板)

常量

定义于命名空间 std::regex_constants
控制正则表达式行为的通用选项
(类型别名)
匹配相关的特定选项
(类型别名)
(C++11)
描述不同类型的匹配错误
(类型别名)

示例

#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
    std::string s = "有些人遇到问题时,会想"
        "“我知道,我要用正则表达式。”"
        "现在他们有了两个问题。";
    std::regex self_regex("REGULAR EXPRESSIONS",
        std::regex_constants::ECMAScript | std::regex_constants::icase);
    if (std::regex_search(s, self_regex))
        std::cout << "文本包含短语'regular expressions'\n";
    std::regex word_regex("(\\w+)");
    auto words_begin = 
        std::sregex_iterator(s.begin(), s.end(), word_regex);
    auto words_end = std::sregex_iterator();
    std::cout << "找到"
              << std::distance(words_begin, words_end)
              << "个单词\n";
    const int N = 6;
    std::cout << "长度超过" << N << "个字符的单词:\n";
    for (std::sregex_iterator i = words_begin; i != words_end; ++i)
    {
        std::smatch match = *i;
        std::string match_str = match.str();
        if (match_str.size() > N)
            std::cout << "  " << match_str << '\n';
    }
    std::regex long_word_regex("(\\w{7,})");
    std::string new_s = std::regex_replace(s, long_word_regex, "[$&]");
    std::cout << new_s << '\n';
}

输出:

文本包含短语'regular expressions'
找到20个单词
长度超过6个字符的单词:
  confronted
  problem
  regular
  expressions
  problems
有些人,当[confronted]一个[problem]时,会想
“我知道,我要用[regular][expressions]。”现在他们有了两个[problems]。