C++ 中的正则表达式:强大的文本处理工具
正则表达式 (regex) 是一种极其强大的工具,用于根据给定模式搜索、提取和替换文本片段。在 C++ 中,对正则表达式的支持始于 C++11 标准,并在头文件 <regex> 中实现。在本文中,我们将通过实际示例详细讲解如何在 C++ 中使用正则表达式。
<regex> 库的主要组件
<regex> 库包含几个关键类和函数:
std::regex— 表示已编译正则表达式的类。std::smatch— 用于存储搜索结果的容器(适用于std::string类型的字符串)。std::regex_match— 检查整个字符串是否与模式匹配。std::regex_search— 在字符串中搜索模式的第一个匹配项。std::regex_replace— 将匹配项替换为指定的文本。
让我们通过示例来逐一了解这些组件。
示例 1:检查字符串是否与模式匹配 (regex_match)
函数 std::regex_match 如果整个字符串完全匹配正则表达式,则返回 true。这非常适合数据验证,例如检查电子邮件或电话号码。
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // 用于验证 email 的模式(简化版) std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})"); if (std::regex_match(email, pattern)) { std::cout << "Email 有效。" << std::endl; } else { std::cout << "Email 无效。" << std::endl; } // 使用无效 email 的示例 std::string bad_email = "user@.com"; if (std::regex_match(bad_email, pattern)) { std::cout << "Email 有效。" << std::endl; } else { std::cout << "Email 无效。" << std::endl; } return 0;}在这个示例中,我们使用了原始字符串 R"(...)" 来避免转义反斜杠。该模式检查字符串是否包含本地部分、@ 符号、域名和顶级域名。
示例 2:在文本中搜索子字符串 (regex_search)
如果需要在字符串内部查找模式的第一个匹配项,可以使用 std::regex_search。结果保存在 std::smatch 对象中。
#include <iostream>#include <regex>#include <string>
int main() { std::string text = "我的电话号码:+7 (123) 456-78-90。请给我打电话!"; // 用于搜索俄罗斯电话号码的模式 std::regex phone_pattern(R"(\\+7\\s?\\(?\\d{3}\\)?\\s?\\d{3}[- ]?\\d{2}[- ]?\\d{2})"); std::smatch match; if (std::regex_search(text, match, phone_pattern)) { std::cout << "找到号码:" << match.str() << std::endl; std::cout << "位置:" << match.position() << std::endl; } else { std::cout << "未找到号码。" << std::endl; } return 0;}match 对象不仅包含找到的字符串,还包含有关匹配位置的信息。方法 match.str() 返回找到的片段,而 match.position() 返回原始字符串中匹配开始的索引。
示例 3:使用 regex_replace 替换文本
函数 std::regex_replace 将模式的所有匹配项替换为指定的字符串。可以使用反向引用 (backrefer