目录
一、概念
1、简介
正则表达式(Regular Expression),通常简写为RegExp或Regex,是一种用于匹配字符串模式的强大工具 。它由一系列字符和特殊符号组成,用于定义匹配模式。正则表达式在文本处理、数据验证、搜索和替换等领域有广泛的应用。
2、字符规则
C++11引入了正则表达式支持,允许使用正则表达式模式来操作和处理字符串。
1. 基本字符匹配:
`\d`:匹配任何数字字符,等同于 `[0-9]`。
`\D`:匹配任何非数字字符,等同于 `[^0-9]`。
`\w`:匹配任何字母、数字或下划线字符。
`\W`:匹配任何非字母、非数字、非下划线字符。
`\s`:匹配任何空白字符,包括空格、制表符、换行符等。
`\S`:匹配任何非空白字符。
2. 自定义字符集合:
`[...]`:用方括号括起来的字符集合,匹配其中的任何一个字符。例如,`[aeiou]` 匹配任何元音字母。
3. 量词:
`*`:匹配前一个元素零次或多次。
`+`:匹配前一个元素一次或多次。
`?`:匹配前一个元素零次或一次。
`{n}`:匹配前一个元素恰好 n 次。
`{n,}`:匹配前一个元素至少 n 次。
`{n,m}`:匹配前一个元素 n 到 m 次。
4. 位置锚定:
`^`:匹配字符串的开头。
`$`:匹配字符串的结尾。
`\b`:匹配单词边界。
5. 分组和捕获:
`(...)`:用小括号来创建一个捕获组,可以提取匹配的内容。
6. 转义字符:
`\`:用于转义具有特殊含义的字符,以匹配它们本身。例如,`\.` 匹配句点字符 `.`。
7. | 操作符:
`|`:用于创建逻辑或操作,可以匹配多个选择之一。例如,`cat|dog` 匹配 "cat" 或 "dog"。
8. 标志:
正则表达式可以附带一些标志,例如 `std::regex::icase` 用于进行不区分大小写的匹配。
二、常用函数
1、std::regex_match
`std::regex_match` 是C++标准库中用于执行完全匹配的正则表达式函数。它用于判断一个字符串是否完全与给定的正则表达式模式匹配。
下面是 `std::regex_match` 的语法和示例:
cpp
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string text = "42";
std::regex pattern(R"(\d+)");
if (std::regex_match(text, pattern)) {
std::cout << "Valid integer." << std::endl;
} else {
std::cout << "Not a valid integer." << std::endl;
}
return 0;
}
有一个字符串 `text`,定义了一个正则表达式模式 `pattern`,该模式用于匹配一个或多个数字。使用 `std::regex_match` 函数将 `text` 与 `pattern` 进行比较,以判断是否完全匹配。
如果字符串 `text` 完全匹配正则表达式模式 `pattern`,则条件成立。
`std::regex_match` 只在整个字符串中查找匹配,如果整个字符串与模式匹配,则返回 `true`,否则返回 `false`。
这是一种用于验证字符串是否完全符合给定模式的方法,非常适用于数据验证和输入检查。
2、std::regex_search
`std::regex_search` 是C++标准库中用于在字符串中搜索匹配的正则表达式模式的函数。与 `std::regex_match` 不同,`std::regex_search` 用于查找字符串中的 部分匹配,而不是要求整个字符串完全匹配。
以下是 `std::regex_search` 的语法和示例:
cpp
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string text = "Contact us at info@example.com or support@test.org for assistance.";
std::regex pattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b)");
std::smatch matches;
while (std::regex_search(text, matches, pattern)) {
std::cout << "Found email: " << matches[0] << std::endl;
text = matches.suffix();
}
return 0;
}
一个包含多个电子邮件地址的字符串 `text`,一个正则表达式模式 `pattern`,该模式用于匹配电子邮件地址。
使用 `std::regex_search` 函数,我们在 `text` 中搜索匹配模式 `pattern` 的内容。当找到匹配时,`std::regex_search` 返回 `true`,并将匹配的内容存储在 `std::smatch` 对象 `matches` 中。
在循环中,我们打印出每次找到的电子邮件地址,并使用 `matches.suffix()` 移动字符串的位置,以便在下次迭代中找到下一个匹配。
`std::regex_search` 通常用于搜索包含多个匹配项的字符串,而不仅仅是验证是否存在匹配。这对于文本分析、提取数据和搜索引擎等应用非常有用。
3、std::regex_replace
`std::regex_replace` 是C++标准库中的函数,用于替换字符串中与正则表达式模式匹配的部分。允许将匹配的文本替换为指定的内容。
下面是关于 `std::regex_replace` 的示例和说明:
cpp
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string text = "The color of the sky is blue, and the ocean is also blue.";
std::regex pattern("blue");
std::string replacement = "green";
std::string result = std::regex_replace(text, pattern, replacement);
std::cout << "Replaced text: " << result << std::endl;
return 0;
}
一个字符串 `text`,并定义了一个正则表达式模式 `pattern`,该模式匹配单词 "blue"。将所有匹配的 "blue" 替换为 "green"。
使用 `std::regex_replace` 函数,将 `text` 中与模式 `pattern` 匹配的部分替换为指定的 `replacement`,然后将结果存储在 `result` 变量中。"blue" 被替换为 "green"。
`std::regex_replace` 是非常有用的,特别是在文本处理中,用于进行替换操作。可以根据需要创建不同的正则表达式模式和替换内容,以实现各种文本替换需求。
三、std::smatch
`std::smatch` 是C++标准库中的一个类,用于存储正则表达式的匹配结果 。它通常用于捕获、存储和访问正则表达式中的匹配子串。
下面是关于 `std::smatch` 的示例和说明:
cpp
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string text = "My phone number is (123) 456-7890.";
std::regex pattern(R"(\(\d{3}\) \d{3}-\d{4})");
std::smatch matches;
if (std::regex_search(text, matches, pattern)) {
std::cout << "Match found: " << matches[0] << std::endl;
std::cout << "Capture group 1: " << matches[1] << std::endl;
} else {
std::cout << "No match found." << std::endl;
}
return 0;
}
使用 `std::smatch` 存储正则表达式模式的匹配结果。正则表达式模式 `(\(\d{3}\) \d{3}-\d{4})` 用于匹配电话号码,并使用小括号 `()` 创建一个捕获组,以便捕获电话号码的不同部分。
在 `std::regex_search` 的调用中,`matches` 用于存储匹配结果。当匹配成功时,`matches[0]` 包含整个匹配的字符串,而 `matches[1]` 包含捕获组 1 中的内容,即电话号码的部分。
`std::smatch` 可以用于存储多个匹配结果,如果正则表达式中有多个捕获组,每个组的内容都可以通过 `matches` 数组来访问。这使得在处理文本数据时,能够轻松提取和操作匹配的部分。
`std::smatch` 类是C++中处理正则表达式的有用工具,特别适合用于从文本中提取和处理特定模式的信息。