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

#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`。

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

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

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

#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` 的示例和说明:

#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` 的示例和说明:

#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++中处理正则表达式的有用工具,特别适合用于从文本中提取和处理特定模式的信息。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhang丶&|!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值