正则表达式库 (C++11 起)
来自 cppreference.cn
< cpp
正则表达式库提供了一个表示正则表达式的类,正则表达式是一种用于在字符串中执行模式匹配的微型语言。几乎所有涉及正则表达式的操作都可以通过以下几个对象来描述:
- 目标序列。用于搜索模式的字符序列。这可以是由两个迭代器指定的范围、一个以空字符结尾的字符串或一个 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].