正则表达式库 (自 C++11 起)
来自 cppreference.com
< cpp
正则表达式库提供了一个表示 正则表达式 的类,正则表达式是一种用于在字符串中执行模式匹配的迷你语言。几乎所有与正则表达式相关的操作都可以通过对以下几个对象的处理来描述
- 目标序列。要搜索模式的字符序列。这可以是两个迭代器指定的范围、一个以 null 结尾的字符字符串或一个 std::string。
- 模式。这本身就是正则表达式。它决定了什么构成匹配。它是一个类型为 std::basic_regex 的对象,从具有特殊 语法 的字符串构造。
- 匹配数组。有关匹配的信息可以作为类型为 std::match_results 的对象检索。
- 替换字符串。这是一个字符串,它决定如何替换匹配项。
内容 |
[编辑] 正则表达式语法
模式和替换字符串支持以下正则表达式语法
- 修改后的 ECMAScript 正则表达式语法。这是默认语法。
- 基本 POSIX 正则表达式语法.
- 扩展的 POSIX 正则表达式语法.
- POSIX 中 awk 实用程序使用的正则表达式语法。
- POSIX 中 grep 实用程序使用的正则表达式语法。这实际上与基本 POSIX 正则表达式语法相同,只是添加了换行符 '\n' 作为交替分隔符。
- POSIX 中 grep 实用程序使用的正则表达式语法,使用 -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) |
控制正则表达式行为的通用选项 (typedef) |
(C++11) |
特定于匹配的选项 (typedef) |
(C++11) |
描述不同类型的匹配错误 (typedef) |
[编辑] 示例
运行此代码
#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].