第19章 正则表达式 - C++
C++正则表达式库提供表示正则表达式的类以及用于在字符串中匹配模式的工具。该库支持以下关键组件:
目标序列:表示要搜索的字符序列。
模式:由std::basic_regex对象定义的正则表达式语法结构。
匹配数组:通过std::match_results对象获取匹配信息。
替换字符串:用于定义替换匹配区域的方式。
该库包含以下主要类:
basic_regex:封装正则表达式语法。
sub_match:识别子表达式的匹配字符序列。
match_results:记录正则表达式的全局匹配信息。
提供以下核心算法:
regex_match:尝试在整体字符序列中匹配正则表达式。
regex_search:尝试在字符序列中任意位置匹配正则表达式。
regex_replace:以格式化方式替换所有或部分匹配结果。
支持以下迭代器:
regex_iterator:遍历所有正则表达式匹配结果。
regextokeniterator:可选子表达式或未匹配区域的迭代方式。
该库还定义了用于报告错误的异常类型:
regex_error等类型以指示错误原因。
此外,默认提供以下辅助功能:
常量命名空间std::regex_constants包含控制选项如标志位设置等技术细节的支持资源。
第19.1节 介绍
该库包含表示正则表达式的类,并将之定义为一种用作模式匹配工具的语言。各种作用于特定对象的操作可大致涵盖所有基于正则表达式的功能:
- 目标字符序列 。由模式识别得到的一系列字符。这些字符可能来自两个迭代器定义的区间范围、空终止符或是通过一个std::string引用获得。
- 正则表达式 。它是一种定义匹配规则的语言结构,在包含特定语法符号和操作符的情况下能够精确描述所需模式。
- 匹配结果集合 。通过该机制可获取完整的匹配信息集合。
- 替代文本 。这种文本用于指导原始输入中的相应部分进行替换操作。
第19.2节 主类
这些类封装正则表达式和在字符的目标序列中匹配正则表达式的结果。
| basic_regex(C++11) | 正则表达式对象 |
|---|---|
| sub_match(C++11) | 标识子表达式所匹配的字符序列 |
| match_results(C++11) | 标识一个正则表达式匹配,包含所有子表达式匹配 |
第19.3节 算法
这些算法将封装于 regex 的正则表达式应用到字符的目标序列。
| regex_match(C++11) | 尝试匹配一个正则表达式到整个字符序列 |
|---|---|
| regex_search(C++11) | 尝试匹配一个正则表达式到字符序列的任何部分 |
| regex_replace(C++11) | 以格式化的替换文本来替换正则表达式匹配的出现位置 |
第19.4节 迭代器
regex_iterator 用于遍历在序列中找到的匹配正则表达式的整个集合。
| regex_iterator(C++11) | 迭代一个字符序列中的所有正则表达式匹配 |
|---|---|
| regex_token_iterator(C++11) | 迭代给定字符串中的所有正则表达式匹配中的指定子表达式,或迭代未匹配的子字符串 |
第19.5节 异常
此类定义作为异常抛出以报告来自正则表达式库错误的类型。
| regex_error(C++11) | 报告正则表达式库生成的错误 |
|---|
第19.5节 常量
该命名区段被定义为std::regex_constants。
| syntax_option_type(C++11) | 控制正则表达式行为的通用选项 |
|---|---|
| match_flag_type(C++11) | 特定于匹配的选项 |
| error_type(C++11) | 描述不同类型的匹配错误 |
第19.6节 案例
- 代码
#include <iostream>
#include <iterator>
#include <string>
#include <regex>
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].
