Regular expressions library (since C++11)
From cppreference.net
<
cpp
正则表达式库提供了一个表示 正则表达式 的类,这是一种用于在字符串内执行模式匹配的微型语言。几乎所有涉及正则表达式的操作都可以通过处理以下若干对象来实现:
- 目标序列 。被搜索模式的字符序列。这可以是由两个迭代器指定的范围、以空字符结尾的字符串或一个 std::string 。
- 模式 。这是正则表达式本身。它决定了什么构成匹配。它是一个 std::basic_regex 类型的对象,通过具有特殊 语法 的字符串构造。
- 匹配数组 . 匹配信息可通过类型为 std::match_results 的对象获取。
- 替换字符串 。这是一个用于确定如何替换匹配项的字符串。
目录 |
正则表达式语法
模式和替换字符串支持以下正则表达式语法:
- 修改后的ECMAScript正则表达式语法 。此为默认语法。
- 基本POSIX正则表达式语法 。
- 扩展POSIX正则表达式语法 。
- POSIX中 awk 工具使用的正则表达式语法。
- POSIX中 grep 工具使用的正则表达式语法。这实际上与基本POSIX正则表达式语法相同,但增加了换行符 ' \n ' 作为交替分隔符。
- POSIX中带 - E 选项的 grep 工具使用的正则表达式语法。这实际上与扩展POSIX正则表达式语法相同,除了 '|' 外,还增加了换行符 ' \n ' 作为交替分隔符。
某些语法变体(例如不区分大小写的匹配)也可用,详见 此页面 。
主要类
这些类封装了一个正则表达式以及在目标字符序列中匹配正则表达式的结果。
|
(C++11)
|
正则表达式对象
(类模板) |
|
(C++11)
|
标识子表达式匹配的字符序列
(类模板) |
|
(C++11)
|
标识一个正则表达式匹配,包括所有子表达式匹配
(类模板) |
算法
这些函数用于将封装在正则表达式中的模式应用于目标字符序列。
|
(C++11)
|
尝试将正则表达式与整个字符序列匹配
(函数模板) |
|
(C++11)
|
尝试将正则表达式与字符序列的任意部分匹配
(函数模板) |
|
(C++11)
|
使用格式化替换文本来替换正则表达式的匹配项
(函数模板) |
迭代器
正则表达式迭代器用于遍历在序列中找到的整个正则表达式匹配集合。
|
(C++11)
|
遍历字符序列中的所有正则表达式匹配
(类模板) |
|
(C++11)
|
遍历给定字符串中所有正则表达式匹配的指定子表达式,或遍历未匹配的子字符串
(类模板) |
异常处理
此类定义了作为异常抛出的对象类型,用于报告正则表达式库中的错误。
|
(C++11)
|
报告正则表达式库生成的错误
(类) |
特性
正则表达式特征类用于封装正则表达式的本地化特性。
|
(C++11)
|
提供正则表达式库所需的字符类型元信息
(类模板) |
常量
|
定义于命名空间
std::regex_constants
|
|
|
(C++11)
|
控制正则表达式行为的通用选项
(类型别名) |
|
(C++11)
|
匹配相关的特定选项
(类型别名) |
|
(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]。