正则表达式库 (自 C++11 起)
来自 cppreference.cn
< cpp
正则表达式库提供了一个类,用于表示正则表达式,这是一种用于在字符串中执行模式匹配的微型语言。几乎所有正则表达式的操作都可以通过操作以下几个对象来表征
- 目标序列。在其中搜索模式的字符序列。这可以是由两个迭代器指定的范围、空终止字符字符串或 std::string。
- 模式。这是正则表达式本身。它确定什么构成匹配。它是 std::basic_regex 类型的对象,由带有特殊语法的字符串构造。
- 匹配数组。关于匹配的信息可以作为 std::match_results 类型的对象检索。
- 替换字符串。这是一个字符串,用于确定如何替换匹配项。
目录 |
[编辑] 正则表达式语法
模式和替换字符串支持以下正则表达式语法
- 修改后的 ECMAScript 正则表达式语法。这是默认语法。
- 基本 POSIX 正则表达式语法.
- 扩展 POSIX 正则表达式语法.
- POSIX 中 awk 实用程序使用的正则表达式语法。
- POSIX 中 grep 实用程序使用的正则表达式语法。这实际上与基本 POSIX 正则表达式语法相同,但添加了换行符 '\n' 作为交替分隔符。
- grep 实用程序在 POSIX 中使用 -E 选项时使用的正则表达式语法。这实际上与扩展 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 = "Some people, when confronted with a problem, think " "\"I know, I'll use regular expressions.\" " "Now they have two problems."; std::regex self_regex("REGULAR EXPRESSIONS", std::regex_constants::ECMAScript | std::regex_constants::icase); if (std::regex_search(s, self_regex)) std::cout << "Text contains the phrase '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 << "Found " << std::distance(words_begin, words_end) << " words\n"; const int N = 6; std::cout << "Words longer than " << N << " characters:\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'; }
输出
Text contains the phrase 'regular expressions' Found 20 words Words longer than 6 characters: confronted problem regular expressions problems Some people, when [confronted] with a [problem], think "I know, I'll use [regular] [expressions]." Now they have two [problems].