「C/C++」C/C++搭建程序框架

news/2024/10/20 1:21:02/

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「UG/NX」NX二次开发「UG/NX」BlockUI集合
「VS」Visual Studio「QT」QT5程序设计
「C/C++」C/C++程序设计「Win」Windows程序设计
「DSA」数据结构与算法「File」数据文件格式

目录

  • 术语介绍
  • 匹配代码
    • 常用标识
    • 转义字符
    • 贪婪与懒惰
  • 常用匹配举例
    • 1. 验证输入数据的格式:
    • 2. 提取文本中的特定信息:
    • 3. 替换文本中的特定模式:
    • 4. 分割文本为不同的单词或句子:
  • C++标准库#include<regex\>​
    • 1. `std::regex`
    • 2. `std::regex_match`
    • 3. `std::regex_search`
    • 4. `std::regex_replace`
    • 5. `std::sregex_iterator`
  • 参考文献


术语介绍

正则表达式说明:

  • 正则表达式:是一种用于描述和匹配字符串模式的工具。

正则表达式功能:

  • 模式匹配:检查一个字符串是否与指定模式匹配。
  • 字符串搜索和替换:在一个文本中搜索并替换符合规则的字符序列。
  • 字符串分割:根据模式将字符串切分成多个部分。
  • 校验输入:对用户输入进行验证,以确保其符合特定格式要求。
  • 数据提取:从字符串中抽取特定的信息、数据或属性。

在线正则表达式测试工具【英文】:https://regex101.com/
在线正则表达式测试工具【中文】:https://regexr-cn.com/
在线正则表达式练习工具:https://www.codejiaonang.com/#/courses
在线正则表达式说明工具:https://r2coding.com

匹配代码

常用标识

字符标识含义
.除换行符外的任意字符
*前面的子表达式零次或多次
+前面的子表达式一次或多次
?前面的子表达式零次或一次
|或运算符。并集,可以匹配符号前后的表达式。
[]匹配方括号中列举的任意一个字符
[^]匹配除了方括号中列举的任意一个字符以外的任意字符
()捕获组,用于分组和提取匹配结果
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
\d任意一个数字字符(0-9)
\D任意一个非数字字符
\w任意一个单词字符(字母、数字、“_”)
\W任意一个非单词字符
\s任意一个空白字符(空格、制表符、换行符等)
\S任意一个非空白字符
\b单词边界
\B非单词边界
^行的开头(或在 [] 中表示取反)
$行的结尾
\转义字符,用于转义特殊字符

转义字符

转义字符说明
\n换行
\t横向跳格(制表符)
\v竖向跳格
\b退格
\r回车
\f走纸换页
\\反斜杠字符 \
\'单引号字符
\a鸣玲
\ddd1到3位八进制数所代表的字符
​​\xhh以十六进制表示的字符(例如,​\x41​ 表示大写字母 ‘A’)
​​\uhhhh​ 以十六进制表示的 Unicode 字符(例如,​\u0041​ 表示大写字母 ‘A’)
​​\Uhhhhhhhh以十六进制表示的长形式 Unicode 字符

贪婪与懒惰

代码说明
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复

常用匹配举例

1. 验证输入数据的格式:

  • 邮箱地址:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 网络地址:^(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$
  • 手机号码:/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/gm
  • 身份证号码:^[1-9]\\d{5}(18|19|20)\\d{2}(0\\d|10|11|12)([0-2]\\d|30|31)\\d{3}[0-9Xx]$

2. 提取文本中的特定信息:

  • 匹配HTML标签中的内容:<([a-zA-Z]+)(?:\\s+[a-zA-Z]+=\"[^\"]*\")*>\\s*([\\w\\W]*?)\\s*</\\1>
  • 匹配URL中的域名:(https?|ftp)://([\\w_-]+(\\.[\\w_-]+)+)(:[0-9]+)?(/\\S*)?

3. 替换文本中的特定模式:

  • 将日期格式从"YYYY/MM/DD"替换为"DD-MM-YYYY":(\d{4})/(\d{2})/(\d{2}) 替换为 \3-\2-\1
  • 删除多余的连续空白字符:\s+ 替换为空格

4. 分割文本为不同的单词或句子:

  • 以逗号和空格分割句子:\\s*,\\s*

C++标准库#include<regex>​

所属头文件:#include<regex>​

组件名称作用
std::regex表示一个正则表达式的对象
std::regex_match将一个字符序列与正则表达式进行完全匹配
std::regex_search在字符序列中搜索满足正则表达式的第一个子序列
std::regex_replace使用给定的格式替换字符串中满足正则表达式的部分
std::sregex_iterator迭代器适配器,用于遍历字符串中所有与正则表达式匹配的子序列
std::smatch存储与正则表达式匹配的结果的容器类
std::ssub_match存储在字符串中与子表达式匹配的结果的容器类

1. std::regex

#include <iostream>
#include <regex>int main() {std::string input = "Hello, World!";std::regex pattern("Hello");if (std::regex_match(input, pattern)) {std::cout << "Pattern matched." << std::endl;} else {std::cout << "Pattern not matched." << std::endl;}return 0;
}

2. std::regex_match

#include <iostream>
#include <regex>int main() {std::string input = "1234";std::regex pattern("\\d+");if (std::regex_match(input, pattern)) {std::cout << "Input string matches the pattern." << std::endl;} else {std::cout << "Input string does not match the pattern." << std::endl;}return 0;
}

3. std::regex_search

#include <iostream>
#include <regex>int main() {std::string input = "Hello, World!";std::regex pattern("World");std::smatch match;if (std::regex_search(input, match, pattern)) {std::cout << "Pattern found: " << match.str() << std::endl;} else {std::cout << "Pattern not found." << std::endl;}return 0;
}

4. std::regex_replace

#include <iostream>
#include <regex>int main() {std::string input = "Hello, World!";std::regex pattern("World");std::string replaced = std::regex_replace(input, pattern, "Universe");std::cout << "Replaced string: " << replaced << std::endl;return 0;
}

5. std::sregex_iterator

#include <iostream>
#include <regex>int main() {std::string input = "Hello, 2021! This is a sample string with numbers 1234.";std::regex pattern("\\d+");std::sregex_iterator iter(input.begin(), input.end(), pattern);std::sregex_iterator end;std::cout << "Matches found: ";for (; iter != end; ++iter) {std::cout << iter->str() << " ";}std::cout << std::endl;return 0;
}

参考文献

正则表达式30分钟入门教程——作者:deerchao
微软.NET正则表达式

在这里插入图片描述


http://www.ppmy.cn/news/1026305.html

相关文章

复现海康威视综合安防管理平台artemis接口Spring boot heapdump内存泄露漏洞

目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现 一、漏洞描述 HIKVISION iSecure Center综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通

flink-对齐和不对齐,精准一次和至少一次

精准一次怎么保证&#xff1f;可以设置为以下2个 对齐 当有一个barrier比较快时&#xff0c;输入缓冲区阻塞&#xff0c;当另外一个barrier到来时&#xff0c;才进行备份&#xff0c;所以数据不会重复。优点&#xff1a;不会造成数据重复缺点&#xff1a;会造成数据积压&#x…

C++STL——deque容器详解

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.deque容器的基本概念二.deque容器常用操作①deque构造函数②deque元素操作③deque赋值操作④deque交换操作⑤deque大小操作⑥deque插入和删除…

MySQL 视图、索引

视图&#xff1a;根据某个实表查询出来的结果&#xff0c;而生成的一个虚表。 1.视图既然作为一张虚表存在&#xff0c;那么对实表的增删改查操作&#xff0c;视图同样成立。 2.视图既然根据实表得到&#xff0c;那对视图的增删改查操作&#xff0c;也会影响实表。 3.视图在查询…

glove安装中的问题

万恶之源&#xff1a; >>> from glove import Glove Traceback (most recent call last):File "<stdin>", line 1, in <module>File "D:\code_related_software\Anaconda\lib\site-packages\glove\__init__.py", line 1, in <mod…

虚拟机的创建与使用

一、虚拟机的下载 链接&#xff1a;百度网盘下载链接 提取码&#xff1a;a9p4 二、新建虚拟机系统 需要有版本序列号 注意: 选择 第一个是纯dos 的窗口指令 桌面没有任何东西 选择第二个就是正常的操作系统.有文件夹 我的电脑之类的 三、从主机中复制文件到虚拟机中需要安装 …

28.Netty源码之缓存一致性协议

Mpsc Queue 基础知识 Mpsc 的全称是 Multi Producer Single Consumer&#xff0c;多生产者单消费者。Mpsc Queue 可以保证多个生产者同时访问队列是线程安全的&#xff0c;而且同一时刻只允许一个消费者从队列中读取数据。 Netty Reactor 线程中任务队列 taskQueue 必须满足多个…

阿里云Windows服务器安装部署MySQL数据库流程

阿里云百科分享如何在Windows系统ECS实例上手动部署MySQL数据库。 目录 前提条件 操作步骤 前提条件 使用本教程进行操作前&#xff0c;请确保您已经注册了阿里云账号。如还未注册&#xff0c;请先完成账号注册。操作系统&#xff1a;Windows Server 2012准备一台ECS云服务…