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

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

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

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

相关推荐
AI街潜水的八角6 分钟前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
JSU_曾是此间年少35 分钟前
数据结构——线性表与链表
数据结构·c++·算法
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
独行soc2 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
ULTRA??3 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
凌云行者4 小时前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl
凌云行者4 小时前
OpenGL入门006——着色器在纹理混合中的应用
c++·cmake·opengl
~yY…s<#>4 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode