「C/C++」C/C++正则表达式

news2025/2/13 11:19:20

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「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.coloradmin.cn/o/863989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv基础60-用分水岭算法cv2.distanceTransform()实现图像分割与提取原理及示例

在图像处理的过程中&#xff0c;经常需要从图像中将前景对象作为目标图像分割或者提取出来。例如&#xff0c;在视频监控中&#xff0c;观测到的是固定背景下的视频内容&#xff0c;而我们对背景本身并无兴趣&#xff0c;感兴趣的是背景中出现的车辆、行人或者其他对象。我们希…

CSP复习每日一题(四)

树的重心 给定一颗树&#xff0c;树中包含 n n n 个结点&#xff08;编号 1 ∼ n 1∼n 1∼n&#xff09;和 n − 1 n−1 n−1条无向边。请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a; 重心是指树中的一…

C++初阶语法——类和对象

前言&#xff1a;C语言中的结构体&#xff0c;在C有着更高位替代者——类。而类的实例化叫做对象。 本篇文章不定期更新扩展后续内容。 目录 一.面向过程和面向对象初步认识二.类1.C中的结构体2.类的定义类的两种定义方式 3.类的访问限定符及封装访问限定符说明 4.类的实例化对…

吴声连续3年讲三翼鸟,用户3年见证场景风起时

听到《风再起时》&#xff0c;你会想到什么&#xff1f; 或许是同名电影、张国荣的同名歌曲&#xff0c;亦或者是某部电视剧&#xff0c;在各自领地中发光发热。 就在8月6日&#xff0c;我们注意到&#xff0c;被业界誉为「了解中国商业发展趋势必听盛会」的《新物种爆炸吴声…

AST入门与实战(二):删除垃圾代码

原文地址:https://zhuoyue360.com/jsnx/109.html AST入门与实战(一):基于babel库的js反混淆模板的实践 : https://www.zhuoyue360.com/jsnx/106.html 还记的上一篇AST的文章,我们把函数调用简单的给替换了一下,但是其最终的效果并不完美. 哪里不完美呢? 有如下几点: 开头的匿…

C语言 指针变量的大小与指针类型

一、指针变量的大小 例如:int main() {int num 10;int* p &num;char ch w;char* pc &ch;printf("%d\n",sizeof(p));printf("%d\n",sizeof(pc));return 0; }答案分别是 4 和 4 指针变量中存储的是地址&#xff0c;而非前缀类型下的元素&…

Sui网络的稳定性和高性能

Sui的最初的协议开发者设计了可扩展的网络&#xff0c;通过水平扩展的方式来保持可负担得起的gas费用。其他区块链与之相比&#xff0c;则使用稀缺性和交易成本来控制网络活动。 Sui主网上线前90天的数据指标证明了这一设计概念&#xff0c;在保持100&#xff05;正常运行的同…

CSS3中的var()函数

目录 定义&#xff1a; 语法&#xff1a; 用法&#xff1a; 定义&#xff1a; var()函数是一个 CSS 函数用于插入自定义属性&#xff08;有时也被称为“CSS 变量”&#xff09;的值 语法&#xff1a; var(custom-property-name, value) 函数的第一个参数是要替换的自定义属性…

【网络编程·传输层】UDP和TCP的经典八股文

目录 一、端口号划分 二、部分指令 1、pidof&#xff08;用于查看进程id&#xff09; 2、netstat&#xff08;查看网络状态&#xff09; 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …

关于接口自动化,你不能不知道的高级技巧——接口自动化神器apin进阶操作

一、变量提取和引用 变量提取和引用主要是为了解决接口之间的参数依赖问题。 使用场景&#xff1a;接口 A 的参数中需要使用接口 B 返回的某个数据&#xff0c;那么就要在请求 B 接口之后&#xff0c;提取数据保存&#xff0c;给请求 A 接口时使用。 1、变量提取 在用例集或…

AST入门与实战(三):if节点转switch节点(瑞数5)

原文地址:https://zhuoyue360.com/jsnx/110.html 1. 期望 这是一个瑞数5代解混淆的案例&#xff0c;我们本章节需要做的是把if节点的内容转换成switch-case内容.以此来熟悉AST对JS混淆的对抗. 原始代码: function whileState() {while (1) {aV cA[wU];if (aV < 4) {if (…

metaRTC7 demo mac/ios编译指南

概要 metaRTC7.0开始全面支持mac/ios操作系统&#xff0c;新版本7.0.023 mac os demo 包含有srs/zlm的推拉流演示。发布版自带了x64版第三方类库&#xff0c;arm版第三方类库还需开发者自己编译。 源码下载 下载文件metartc7.023.7z https://github.com/metartc/metaRTC/re…

远程桌面弱口令攻击:网络安全的顽疾与挑战

导语&#xff1a; 随着远程办公和云技术的普及&#xff0c;远程桌面弱口令攻击成为了网络安全的顽疾。本文将深入探讨弱口令攻击的原理、危害以及有效的防范措施&#xff0c;帮助读者提升远程桌面安全性。 第一部分&#xff1a;弱口令攻击的原理与方法 1.1 什么是远程桌面弱口…

页面的滚动及scrollIntoView的穿透效果和解决

朋友今天遇到一个奇怪的问题&#xff0c;我觉得很有意思就记录一下。现象是这样的&#xff0c;页面有一个按钮&#xff0c;点击按钮以后会请求一个接口拿到一个iframe的地址然后创建一个iframe并渲染到页面上&#xff0c;iframe的页面加载完毕后会滑动到对应的某一个元素的位置…

统一门户|WorkPlus整合内部应用,构筑企业统一的智能工作入口

国家“十四五”发展规划中指出加强数字化发展&#xff0c;支持企业建设一体化数字平台&#xff0c;全面整合企业内部系统&#xff0c;提升产业链上下游协同效率。而在数字化经济浪潮下&#xff0c;企业和各类组织随着业务规模、人员规模的不断扩大&#xff0c;在信息化办公中存…

一次暴露面全开的红帽渗透测试【getshell】

0x01、信息收集阶段 注&#xff1a;本次信息收集过程主要使用FOFA网络探测平台 https://fofa.info/ 一开始进行收集的时候&#xff0c;有点迷&#xff0c;直接进行了大面积的"gov.in"域名收集 host"gov.in" && country"IN" 哈哈68465…

buuctf crypto刷题1

目录 (1) 凯撒&#xff1f;替换&#xff1f;呵呵!(替换密码爆破) (2) RSA1(dp泄露) (3) RSA2(dp泄露大整数分解) (4) RSA3(共模攻击) (5) 还原大师(md5爆破) (6) RSA(公钥文件解析) (7) RsaRoll (8) Dangerous RSA(小明文攻击) (9) [GUET-CTF2019]BabyRSA (10) [BJD…

成集云 | 聚水潭售后申请单同步伙伴云 | 解决方案

方案介绍 聚水潭是一款电商平台&#xff0c;提供售后申请功能帮助用户解决购物过程中遇到的问题&#xff0c;售后申请功能为用户提供了便利的售后服务&#xff0c;并促进用户与商家或卖家之间的沟通和协商。用户可以在聚水潭平台上轻松提交售后申请&#xff0c;并随时查看处理…

『赠书活动 | 第十七期』《Python网络爬虫:从入门到实战》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十七期』 本期书籍&#xff1a;《Python网络爬虫&#xff1a;从入门到实战》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff5c;收…

国内唯一!腾讯零信任iOA入选全球UEM厂商全景图

近日&#xff0c;国际权威机构Forrester发布《The Unified Endpoint Management Landscape, Q3 2023》&#xff08;以下简称“报告”&#xff09;&#xff0c;对全球24家统一终端管理厂商进行了综合性评估&#xff0c;腾讯安全凭借零信任iOA在DEX&#xff08;数字化员工体验&am…