• (C++进阶)正则表达式


    目录

    一、概念

    1、简介

    2、字符规则

    二、常用函数

    1、std::regex_match

    2、std::regex_search

    3、std::regex_replace

    三、std::smatch


    一、概念

    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` 的语法和示例:

    1. #include
    2. #include
    3. #include
    4. int main() {
    5.     std::string text = "42";
    6.     std::regex pattern(R"(\d+)");
    7.     if (std::regex_match(text, pattern)) {
    8.         std::cout << "Valid integer." << std::endl;
    9.     } else {
    10.         std::cout << "Not a valid integer." << std::endl;
    11.     }
    12.     return 0;
    13. }

    有一个字符串 `text`,定义了一个正则表达式模式 `pattern`,该模式用于匹配一个或多个数字。使用 `std::regex_match` 函数将 `text` 与 `pattern` 进行比较,以判断是否完全匹配。

    如果字符串 `text` 完全匹配正则表达式模式 `pattern`,则条件成立。

    `std::regex_match` 只在整个字符串中查找匹配,如果整个字符串与模式匹配,则返回 `true`,否则返回 `false`。

    这是一种用于验证字符串是否完全符合给定模式的方法,非常适用于数据验证和输入检查。

    `std::regex_search` 是C++标准库中用于在字符串中搜索匹配的正则表达式模式的函数。与 `std::regex_match` 不同,`std::regex_search` 用于查找字符串中的部分匹配,而不是要求整个字符串完全匹配。

    以下是 `std::regex_search` 的语法和示例:

    1. #include
    2. #include
    3. #include
    4. int main() {
    5.     std::string text = "Contact us at info@example.com or support@test.org for assistance.";
    6.     std::regex pattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b)");
    7.     std::smatch matches;
    8.     while (std::regex_search(text, matches, pattern)) {
    9.         std::cout << "Found email: " << matches[0] << std::endl;
    10.         text = matches.suffix();
    11.     }
    12.     return 0;
    13. }

    一个包含多个电子邮件地址的字符串 `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` 的示例和说明:

    1. #include
    2. #include
    3. #include
    4. int main() {
    5.     std::string text = "The color of the sky is blue, and the ocean is also blue.";
    6.     std::regex pattern("blue");
    7.     std::string replacement = "green";
    8.     std::string result = std::regex_replace(text, pattern, replacement);
    9.     std::cout << "Replaced text: " << result << std::endl;
    10.     return 0;
    11. }

    一个字符串 `text`,并定义了一个正则表达式模式 `pattern`,该模式匹配单词 "blue"。将所有匹配的 "blue" 替换为 "green"。

    使用 `std::regex_replace` 函数,将 `text` 中与模式 `pattern` 匹配的部分替换为指定的 `replacement`,然后将结果存储在 `result` 变量中。"blue" 被替换为 "green"。

    `std::regex_replace` 是非常有用的,特别是在文本处理中,用于进行替换操作。可以根据需要创建不同的正则表达式模式和替换内容,以实现各种文本替换需求。

    三、std::smatch

    `std::smatch` 是C++标准库中的一个类,用于存储正则表达式的匹配结果它通常用于捕获、存储和访问正则表达式中的匹配子串。

    下面是关于 `std::smatch` 的示例和说明:

    1. #include
    2. #include
    3. #include
    4. int main() {
    5.     std::string text = "My phone number is (123) 456-7890.";
    6.     std::regex pattern(R"(\(\d{3}\) \d{3}-\d{4})");
    7.     std::smatch matches;
    8.     if (std::regex_search(text, matches, pattern)) {
    9.         std::cout << "Match found: " << matches[0] << std::endl;
    10.         std::cout << "Capture group 1: " << matches[1] << std::endl;
    11.     } else {
    12.         std::cout << "No match found." << std::endl;
    13.     }
    14.     return 0;
    15. }

    使用 `std::smatch` 存储正则表达式模式的匹配结果。正则表达式模式 `(\d3" role="presentation">\d3 \d{3}-\d{4})` 用于匹配电话号码,并使用小括号 `()` 创建一个捕获组,以便捕获电话号码的不同部分。

    在 `std::regex_search` 的调用中,`matches` 用于存储匹配结果。当匹配成功时,`matches[0]` 包含整个匹配的字符串,而 `matches[1]` 包含捕获组 1 中的内容,即电话号码的部分。

    `std::smatch` 可以用于存储多个匹配结果,如果正则表达式中有多个捕获组,每个组的内容都可以通过 `matches` 数组来访问。这使得在处理文本数据时,能够轻松提取和操作匹配的部分。

    `std::smatch` 类是C++中处理正则表达式的有用工具,特别适合用于从文本中提取和处理特定模式的信息。

  • 相关阅读:
    苹果签名应用掉签频繁原因排查,以及如何避免
    定时任务框架
    校园租车系统
    学习笔记-JUC基础
    基于Springboot+Mybatis+mysql+vue宠物领养网站1.0
    SSM - Springboot - MyBatis-Plus 全栈体系(二十七)
    Maven笔记
    扩展学习|大数据分析的现状和分类
    python局部变量与全局变量问题
    163_技巧_Power BI 一键批量建立自定义字段参数
  • 原文地址:https://blog.csdn.net/qq_57594025/article/details/134005713