【C++技能树】快速文本匹配 --正则表达式介绍与C++正则表达式使用

news2024/9/28 17:25:43

在这里插入图片描述
Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。
在这里插入图片描述

0.正则表达式存在必要性

在日常生活,或者刷题过程中我们难免需要检测一段字符是否需要是否符合规定,或在一大段字符中寻找自己想要的信息.

**一个字一个字来看**十分的费劲且效率低下.有没有一种方法可以快速的匹配到自己需要的文本呢?

假设要判断一个QQ号是否有效,他必须满足以下三个规则

  • 长度大于等于5,且小于等于11
  • 首位不能是0
  • 是否为纯数字

这项工作可以通过c语言来完成

string qq;
cin>>qq;
bool valid=true;
if(qq.legth()<5||qq.length()>11)
    valid=false;
if(qq[0]=='0')
    valid=false;
for(int i=0;i<qq.length();i++)
{
    if(qq[i]<'0'||qq[i]>'9')
        valid=false;
}
if(valid)
    cout<<"valid"<<endl;
else
    cout<<"invalid"<<endl;

虽然看起来很简单就能判断出来了.但这仅是含有数字的QQ号,若我需要判断E-Mail、地址…相信那时的工作绝不是这几行代码就能结束的.

如果使用正则表达式来完成这项工作.代码就会进一步的简介(关于正则表达式的具体语法我们暂且按下不表)

string qq;
cin>>qq;
regex qq_match("[^0][0-9]{4,10}");
bool ret=regex_match(qq,qq_match);
cout<<(ret==true:"valid"?"invalid")<<endl;

仅需五行代码就可以达到上面同等的效果,下面来一起进入正则表达式的世界吧

1.正则表达式介绍

概念就不细说了,仅需要知道:

其叫正则表达式,也叫规则表达式,regex.其核心就是使用特定的文本作为规则,然后去匹配一般的字符串中符合符合这个规则的部分.正则表达式的泛用性很强,在很多高级语言中都有出现.其匹配规则是不变的,改变的仅是使用的函数,

正则表达式的优点很多

  1. 灵活且逻辑性强
  2. 可以迅速的以简单的方式达到字符串的控制

缺点就是难,但这应该是我的问题(doge

2.元字符及匹配规则的介绍

^:匹配行的开头:

通常目的是要求正则表达式精确的匹配开头的部分

$:匹配行的结尾:

通常目的是为了精确的匹配到结尾的位置

.:可以匹配除/r与/n以外的任何字符:

r.t 可以匹配到rat也可以匹配到rut

[…]:可以匹配到[]内的任意一个字符

[abcdef]可以匹配到apple

而[ ^abcdef] 则表示可以匹配不在[]范围内的任何字符,plain

[a-z]是范围匹配,可以匹配到小写字母a-z的任意一个

所以[ ^a-z]则表示非小写字母中的任何一个

(…):设定分组

\:转义字符:

所有语言都有的转义字符.也就是\n可能在这个语言中代表的是换行,但是你若就是想匹配其原来的意思,你就可以加上\

此时表示的是匹配\n

\d匹配数字0-9:

相当于[0-9]

\D取反\d:

相当于[ ^0-9]

\w匹配字母数字下划线:

相当于[a-zA-Z0-9_]

\W取反\w:

相当于[ ^a-zA-Z0-9_]

+前面的元素重复一次或多次:

例如zo+可以匹配到"zo" "zooo"但不能匹配到z因为其一次都没出现过

*****前面的任意元素出现了任意次:

例如zo*可以匹配到"zo" “zooo” “z

**?**前面的元素出现了一次或零次:

例如:thu(er)?可以匹配到thuer,也可以匹配到thu,但不能匹配到thuerer,因为出现了两次

{n}前面的元素出现了n次:

例如"o{2}“可以匹配到"foot” 也可以匹配到"boot,但不能匹配到"Bob"(因为只出现了一次)

{n,}前面的元素出现至少n次:

例如,o{2,}可以匹配到"foooood"但不能匹配到"bob"(因为只出现了一次)

**{n,m}**前面的元素至少出现了n次,最多出现了m次:

例如"o{1,3}"将匹配的"foooooood"前六个o为两组,最后一个o为一组

"o{0,1}等价于(o)?"注意{0,1}之间不能有空格

|逻辑或:

[z|f]ood可以匹配到"food"或者"zood".

以上为较为常见的正则表达式元字符,灵活使用已经可以解决大部分情况

3.C++正则表达式函数:

其包含头文件为

#include<regex>

Regex_match:

常用的匹配函数为其存在标准命名空间里,这里填入需要匹配的表达式

std::regex_match(匹配对象,匹配方式)

例如现在需要匹配一个以下格式的字符串:tel:086-0666-88810009999,利用上面所学知识可以轻松的写出来的他的正则表达式

1{1,3}-[0] [0-9]{2,3}-[0,9]{8,11}$,来解释一下他的含义.

首先从行开头开始:^,前1-3个数字为0-9:[0,9]{1,3},然后出现数字0一位数字0-9二到三个:[0] [0,9]{2,3}

之后再出现八到十一个数字:[0,9]{8,11} 之后就是行结尾:$>

下面是其c++代码示例

#include<iostream>
using namesapce std;
int main()
{
    string tel;
    cin>>tel;
    regex tel_reg("^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$");
    bool ret=regex_match(tel,tel_reg);
    cout<<(ret?"Valid":"Invalid")<<endl;
}

Regex_repelace

regex_place(匹配对象,匹配方式,替换内容)

下面这段内容为将"he…ll…o, wor…l…d! “中的.全部删掉,也就是替换成”"

#include<iostream>
using namesapce std;
int main()
{
    std::string str = "he......ll..o, wor...l...d!";
    regex reg("\\.");
    cout<<regex_replace(str,reg,"");
}

下面为一些常见的正则表达式匹配文本(可用作理解正则表达式):

  1. 验证用户名和密码:"2\w{5,15}$“正确格式:”[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母,长度6~16位;

  2. 验证电话号码:"^(\d{3,4}-)\d{7,8}$"正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;

  3. 验证手机号码(包含虚拟号码和新号码段):“^1([38][0-9]|4[5-9]|5[0-3,5-9]|66|7[0-8]|9[89])[0-9]{8}$”;

  4. 验证身份证号(15位):“\d{14}[[0-9],0-9xX]”,(18位):“\d{17}(\d|X|x)”;

  5. 验证Email地址:“^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$“或者”[a-zA-z0-9_]+@[a-zA-z0-9]+(.[a-zA-z]+){1,3}”;

  6. 只能输入由数字和26个英文字母组成的字符串:“3+$”;

  7. 整数或者小数:“4+([.][0-9]+){0,1}$”;

  8. 只能输入数字:“5*$”;

  9. 只能输入n位的数字:“^\d{n}$”;

  10. 只能输入至少n位的数字:“^\d{n,}$”;

  11. 只能输入m~n位的数字:“^\d{m,n}$”;

  12. 只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”;

  13. 只能输入有两位小数的正实数:“6+(.[0-9]{2})?$”;

  14. 只能输入有1~3位小数的正实数:“7+(.[0-9]{1,3})?$”;

  15. 只能输入非零的正整数:“^+?[1-9][0-9]*$”;

  16. 只能输入非零的负整数:“^-[1-9][0-9]*$”;

  17. 只能输入长度为3的字符:“^.{3}$”;

  18. 只能输入由26个英文字母组成的字符串:“8+$”;

  19. 只能输入由26个大写英文字母组成的字符串:“9+$”;

  20. 只能输入由26个小写英文字母组成的字符串:“10+$”;

  21. 验证是否含有^%&',;=? 等 ¨ 字符: " [ \"等字符:"[%&',;=? ¨字符:"[^“]+”;

  22. 只能输入汉字:“11{0,}$”(这里使用了Unicode字符码哦);

  23. 验证URL:“^https?😕/([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$”;

  24. 验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:“01"~"09"和"10"~"12”;

  25. 验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;“01"~"09”、"10"~"29"和“30”~“31”;

  26. 获取日期正则表达式:“^\d{4}[年|-|.]\d{\1-\12}[月|-|.]\d{\1-\31}日?$”(可用来匹配大多数年月日信息);

  27. 匹配双字节字符(包括汉字在内):“[^\x00-\xff]”(可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1));

  28. 匹配空白位置"[\f\n\r\t\v]"(可以用来删除空白行);

  29. 匹配HTML标记的正则表达式:“<(\S?)[^>]>.?</>|<.? />”(这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力);

  30. 匹配首尾空白字符的正则表达式:"^\s|\s$"(可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式);**

  31. 匹配网址URL的正则表达式:“[a-zA-z]+://[^\s]*”;

  32. 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):“12[a-zA-Z0-9_]{4,15}$”;

  33. 匹配腾讯QQ号:“[1-9][0-9]{4,10}”;

  34. 匹配中国邮政编码:“[1-9]\d{5}(?!\d)”(中国邮政编码为6位数字);

  35. 匹配ip地址:“([1-9]{1,3}.){3}[1-9]”(提取ip地址时有用);

  36. 匹配MAC地址:(“[A-Fa-f0-9]{2}😃{5}[A-Fa-f0-9]”。


  1. 0-9 ↩︎

  2. a-zA-Z ↩︎

  3. A-Za-z0-9 ↩︎

  4. 0-9 ↩︎

  5. 0-9 ↩︎

  6. 0-9 ↩︎

  7. 0-9 ↩︎

  8. A-Za-z ↩︎

  9. A-Z ↩︎

  10. a-z ↩︎

  11. \u4e00-\u9fa5 ↩︎

  12. a-zA-Z ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429784.html

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

相关文章

Mysql 数据库介绍

数据库介绍 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;每个数据库都有一个或多个不同的API接口用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。 我们也可以将数据存储在文件中&#xff0…

支持m2的主板换m2硬盘无法识别的问题,主板:七彩虹H410-T

记录一下我的电脑换m2硬盘遇到无法读取的问题&#xff0c;也给有同样问题的人留个参考&#xff0c;特别是七彩虹主板 主板&#xff1a;七彩虹H410-T 遇到的问题&#xff1a; m2 硬盘插上主板后&#xff0c;开机无法识别&#xff0c;打开我的电脑没有相应的盘&#xff0c;设备…

代码随想录---142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…

【C++】vector的实现

模拟实现vector类前言一、迭代器二、重载 [ ]三、构造函数相关&#xff08;重点&#xff09;&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;构造并使用n个值为value的元素初始化&#xff08;3&#xff09;区间构造&#xff08;4&#xff09;拷贝构造三、析构函数…

什么是科学

人人都是价值观-思辨专家_个人渣记录仅为自己搜索用的博客-CSDN博客 相关文章 人人都是中医爱好者 科学定义 关于“科学”这个词的定义&#xff0c;历史上曾出现过多种版本&#xff0c;但是目前为止还没有一个是世人公认的定义。 历史上达尔文(Charles Robert Darwin&#xff…

利用阿里云免费部署openai的Chatgpt国内直接用

背景 国内无法直接访问ChatGPT&#xff0c;一访问就显示 code 1020。而且最近OpenAI查的比较严格&#xff0c;开始大规模对亚洲地区开始封号&#xff0c;对于经常乱跳IP的、同一个ip一堆账号的、之前淘宝机刷账号的&#xff0c;账号被封的可能性极大。 那么有没有符合openai规定…

< element-Ui表格组件:表格多选功能回显勾选时因分页问题,导致无法勾选回显的全部数据 >

文章目录&#x1f449; 前言&#x1f449; 一、解决思路&#x1f449; 二、实现代码&#xff08;仅供参考&#xff0c;具体问题具体分析&#xff09;> HTML模板> Js模板往期内容 &#x1f4a8;&#x1f449; 前言 在 Vue elementUi 开发中&#xff0c;elementUI中表格在…

Linux服务器怎么修改系统时间

Linux服务器怎么修改系统时间 linux服务器的系统时间&#xff0c;有的时候会产生误差&#xff0c;导致我们的程序出现一些延迟&#xff0c;或者其他的一些错误&#xff0c;那么怎么修改linux的系统时间呢&#xff1f; 我是艾西&#xff0c;今天又是跟linux小白分享小知识的时间…

C语言函数大全-- l 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- l 开头的函数 1. labs&#xff0c;llabs 1.1 函数说明 函数声明函数功能long labs(long n);计算长整型的绝对值long long int llabs(long long int n);计算long long int 类型整数的绝对值 1.2 演示示例 #include <stdio.h> …

Python-Python基本用法(全:含基本语法、用户交互、流程控制、数据类型、函数、面向对象、读写文件、异常、断言等)

1 环境准备 编辑器&#xff1a;Welcome to Python.org 解释器&#xff1a;pycharm&#xff1a;Thank you for downloading PyCharm! (jetbrains.com) 2 Quick start 创建项目 new project create demo print(Dad!!)3 基本语法 3.1 print 直接打印 print(Dad!!)拼接打印…

记录-Vue.js模板编译过程揭秘:从模板字符串到渲染函数

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 Vue.js是一个基于组件化和响应式数据流的前端框架。当我们在Vue中编写模板代码时&#xff0c;它会被Vue编译器处理并转换为可被浏览器解析的JavaScript代码。Vue中的模板实际上是HTML标记和Vue指令的组…

STM32HAL库 串口USART的使用

STM32HAL库 串口USART的使用 文章目录STM32HAL库 串口USART的使用前言一、配置USART1串口通信引脚二、使用步骤三、串口中断回调函数1. 配置2. 在icode中增加usart.c和usart.h文件3. 中断处理对比4. 编写串口控制程序总结前言 本文为串口输出打印的hal库&#xff0c;参考洋桃电…

【LeetCode】剑指 Offer 57. 和为 s 的数字 p280 -- Java Version

1. 题目介绍&#xff08;57. 和为 s 的数字&#xff09; 面试题57&#xff1a;和为 s 的数字&#xff0c; 一共分为两小题&#xff1a; 题目一&#xff1a;和为 s 的两个数字题目二&#xff1a;和为 s 的连续正数序列 2. 题目1&#xff1a;和为s的两个数字 题目链接&#xff1…

图结构基本知识

图1. 相关概念2. 图的表示方式3. 图的遍历3.1 深度优先遍历&#xff08;DFS&#xff09;3.2 广度优先遍历&#xff08;BFS&#xff09;1. 相关概念 图G(V,E) &#xff1a;一种数据结构&#xff0c;可表示“多对多”关系&#xff0c;由顶点集V和边集E组成&#xff1b;顶点(vert…

数据库管理-第六十七期 SQL Domain 2(20230414)

数据库管理 2023-04-14第六十七期 SQL Domain 21 Domain函数示例总结第六十七期 SQL Domain 2 昨晚割接&#xff0c;搭了一套19c的ADG&#xff0c;今天睡了个懒觉&#xff0c;早上把笔记本内存扩到了64GB&#xff0c;主要是为了后面做实验。然后下午拼了个乐高&#xff0c;根据…

Excel小技巧:对比两列数据的异同、vlookup使用方法

目录 问题一&#xff1a; 在联盟对接的时候&#xff0c;团购站会推送一个返利值&#xff0c;称为“推送返利”&#xff0c;联盟后台又会计算一个返利值&#xff0c;称为“计算返利”。当团购站的推送返利与计算返利相同的时候&#xff0c;我们才认为这个团购站在返利上对接完…

JMeter全局变量在使用时第一次取到null的问题解决

1. 在执行JMeter测试时&#xff0c;登录操作只需要执行一次。这样就需要用到全局变量&#xff0c;但在前一个提取器执行了请求后&#xff0c;如果返回结果是json格式的数据&#xff0c;会在下面添加一个JSON提取器&#xff0c;并在json提取器下会添加一个后置BeanShell PostPro…

10个镜像网站工具箱供你使用,不注册ChatGPT也能免费使用ChatGPT

ChatGPT已经成为了人工智能技术中备受瞩目的一员&#xff0c;它可以为我们带来更加智能化、个性化的交互体验。对于没有ChatGPT账号或者不想注册账号的人来说&#xff0c;他们可能会错过这种神奇的体验。 而本篇文章就帮大家解决这个问题&#xff0c;不用登录ChatGPT账号&…

Spark 写 MySQL经典50题

目录 建表 & 添加数据 表结构分析图 连接数据库 题目 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数 3、查询平均成绩大于等于60分的同学的学生编号和学…

如何将GIS地图和可视化结合使用实现更好的数据呈现

GIS&#xff08;地理信息系统&#xff09;和可视化&#xff08;visualization&#xff09;是两个紧密相关的领域。GIS是一种用于管理、分析和展示地理空间数据的技术&#xff0c;而可视化则是一种用图形、图表、动画等形式展示数据的方式。GIS地图则是指基于地理信息系统技术&a…