第二十天(正则表达式与功能实际运用)

在程序员一生的工作中,遇到的最多的数据就是字符串
字符串里面很有可能有很多的不需要的信息
我们需要从中间挑选出我们需要的
如果循环去写,比较简单的时候问题不大
规则多了,你的工作量会成倍上升的
为了解决这个问题 ---- 正则表达式

正则表达式 --- 一种规则,用于匹配我们需要的字符/字符串
简单一点就是一种匹配规则
字符串的处理通过这个正则表达式会变得简单很多

正则表达式字符分为两种
1 普通字符 -- 只代表这个字符本身
a b c d e f......
2 元字符:有特殊意义的字符
它不代表字符本身的意思,另外赋予它意思了
如:scanf printf里面的%

正则表达式里面的元字符
.   : 匹配任意的一个单个字符
[]  : 字符组,但是它只代表其中一个
[]里面可能会写很多个字符,但是只代表一个字符
只能有一个字符和[]里面的字符去匹配
挑里面有的去匹配
如:[abcdefg] -> 43720jklrhj423urlkehk23hijka
后面的字符串只有e 和 a才能被匹配
这个[]里面也有一个元字符 -
-:表示从ASCII码开始到ASCII码结束这一节所有的字符
有开始有结束才代表连接,否则就是-自己本身
[A-Z]: 表示 A到Z中间所有的字符,只会匹配其中一个
[a-z]: 匹配一个小写字母
[A-Za-z]:匹配
[0-9]:匹配数字字符
[-9]:这个没有开始,那么-就是它自己
匹配-或者9字符
^   : 排除字符,把它们排除掉
[^0-9] : 排除所有的数字字符,其它的字符都可以和我匹配
[^0-9A-Za-z] : 排除数字字符和字母

    字母  数字这些比较特殊,因此会有东西直接表示
\d  : 匹配数字字符
\D  : 排除数字字符
\w  : 匹配数字字母下划线
\W  : 排除数字字母下划线
\s  : 空白字符
\S  : 非空字符

匹配多个字符
+   : 匹配1个或者多个先前字符
[A-Z]+ 匹配长度至少为1的大写字母
[A-Z]
[A-Z][A-Z]
[A-Z][A-Z][A-Z]
[A-Z][A-Z][A-Z][A-Z]
........
dahsjkAbc  -> 只有A可以匹配
dhsajkDEf   -> DE可以匹配
dasdwqda    -> 没有
A
BC
DFG
.....

    *   :匹配0个或者多个先前字符
[A-Z]*
空的
[A-Z]
[A-Z][A-Z]
[A-Z][A-Z][A-Z]
[A-Z][A-Z][A-Z][A-Z]
........

    ?   : 匹配0个或者1个先前字符
[A-Z]?
空的
[A-Z]

    我们也可以指定数量来进行匹配
{数字}
a{3} 
aaa
[A-Z]{3}
[A-Z][A-Z][A-Z]
指定数量里面我们也可以给范围
{最小数量,最大数量}
[A-Z]{1,3}
[A-Z]
[A-Z][A-Z]
[A-Z][A-Z][A-Z]
如果没有最大数量表示上不封顶

    ()被看成是一个整体,这个整体我们叫子模式
(abc){1,3} 
abc
abcabc
abcabcabc
abc{1,3} -> 区分
abc
abcc
abccc
(|) 二选一
(abc|123){1,2}
abc
abcabc
abc123
123
123123
123abc
\ 转义字符
\.  ->普通的.
\d.c -> 1.c 11c 1cc 2cc 3dc
\d\.c -> 1.c 2.c 3.c
\\  ->普通的\
\*  ->普通的*

    ipv4 : 用4个字节表示一个ip地址
xxx.xxx.xxx.xxx
192.168.5.250   
有一个字符串待匹配
dhasjkdhwq3123.342432.123.34.53.6dashjk.123.234.12.4dhasjk
请你写一个正则表达式来匹配ip地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

我在我的系统里面存了一个pxxxxx.c的这么一个文件,我忘记放哪里了,你帮我找一下
xxxxx是数字,我不记得有多少个了
p[0-9]+\.c

c语言支持了正则表达式

NAME
regcomp, regexec, regerror, regfree - POSIX regex functions

SYNOPSIS
#include <sys/types.h>
#include <regex.h>

       int regcomp(regex_t *preg, const char *regex, int cflags);
preg:编译好了的正则表达式 --- 就是它能看得懂的字节码
这个玩意儿是一个地址
regex:你编辑的正则表达式,是一个字符串
如:"p[0-9]+\.c"    
cflags: 标志 ,用位域实现的 
REG_EXTENDED    : 扩展的正则表达式,一般都带上这个标志
REG_ICASE       :  忽略大小写
REG_NOSUB       : 忽略子模式
REG_EXTENDED | REG_ICASE  用扩展的正则表达式并且忽略大小写
成功返回0,失败返回错误码


//运行我们的正则表达式
int regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
preg:编译好了的正则表达式
string:待匹配字符串
nmatch:你有多少个模式 1 + n,一般n <= 实际子模式数
总模式(1) + 子模式(n)
"ds(ajh)(kd)wh(jk)"
pmatch:匹配的信息,也就是匹配的结果
它是一个数组
pmatch = malloc(sizeof(regmatch_t) * nmatch) 
第一个元素为总模式
后面的为子模式
typedef struct {
regoff_t rm_so;//start 开始  待匹配字符串的下标
regoff_t rm_eo;//end   结束  待匹配字符串的下标
} regmatch_t;
eflags:一个标志
一般给0
返回值:
成功返回0,你可能会有后续继续的匹配
失败返回  REG_NOMATCH

       size_t regerror(int errcode, const regex_t *preg, char *errbuf,
size_t errbuf_size);
errcode:错误码
preg:编译了的正则表达式
errbuf:存放解析好了的错误信息
errbuf_size:你给errbuf的最大存储空间
成功返回实际写入errbuf里面的字节数

       void regfree(regex_t *preg);
释放preg


//心中有的数 如果是正则表达式是有问题的为1 如果是其它的表示为2 成功是0

int regerror(int errcode, const regex_t *preg, char *errbuf,
size_t errbuf_size)
{
int len = 0;
switch(errcode)
{
case 0:
len = strlen("success") < errbuf_size ? strlen("success") : errbuf_size;
strncpy(errbuf,"success",len);
return len;
case 1:
len = strlen("zheng ze biao da shi you wen ti") < errbuf_size ? strlen("zheng ze biao da shi you wen ti") : errbuf_size;
strncpy(errbuf,"heng ze biao da shi you wen ti",len);
return len;
case 2:
len = strlen("other") < errbuf_size ? strlen("other") : errbuf_size;
strncpy(errbuf,"other",len);
return len;
default:
return -1;
}


}    

#include <sys/types.h>
#include <regex.h>
#include <stdio.h>
#include <string.h>//我们挑网址出来  (www){1}\.[A-Za-z0-9]+\.(com){1}
#define REGEXSTRING "(www){1}\\.[A-Za-z0-9]+\\.(com){1}"const char * const str = "dsahejkdwqhdsaww.sadhjkdhwww.dashjd.www.baidu.com\
dashjkdhwqjww.baidu.cmwww.hehe.comasdwqwww.123123.comshadjkwqhk";int main()
{//编译我们的正则表达式//regex_t * preg = (regex_t *)malloc(sizeof(regex_t));//空间是在堆上面开的  搞完要释放的regex_t  preg;//在栈上面开的  代码块弄完自动释放int r = regcomp(&preg,REGEXSTRING,REG_EXTENDED);char buf[1024] = {0};if(r != 0)//错了{//解析错误信息 int l = regerror(r,&preg,buf,1023);if(l > 0)//解析错误成功{//最好补个\0buf[l] = 0;printf("regcomp error:%s\n",buf);return -1;}printf("不知道什么错误\n");return -2;         }//执行正则表达式//返回值如果为0  说明后面还有可能有未匹配到的const char * ptr = str;regmatch_t pmatch[3];//存放我们的结果while(1){r = regexec(&preg,ptr,3,pmatch,0);if(r != 0){break;}//匹配成功for(int i = 0;i < 3;i++){printf("[%ld,%ld) -> ",pmatch[i].rm_so + ptr - str,pmatch[i].rm_eo + ptr - str);strncpy(buf,ptr + pmatch[i].rm_so,pmatch[i].rm_eo - pmatch[i].rm_so);buf[pmatch[i].rm_eo - pmatch[i].rm_so] = 0;//补\0if(i == 0){printf("总模式:%s\n",buf);}else{printf("子模式:%s\n",buf);}}ptr += pmatch[0].rm_eo;//将匹配过的字符串给跳过}regfree(&preg);return 0;
}


//有用正则表达式的命令

find -> 查找
find [path] [options]
path:你要查找的路径
不给默认当前路径

    options:
-name -> 指定你要查找的名字
里面有两个通配符可以使用
* -> 所有的
? -> 一个字符
find ./ -name "*.c" -> 在当前路径下面查找所有的.c文件

-regex -> 用正则表达式来查

    查当前文件夹下面所有的数字.c文件
find ./ -regex "\d+\.c"

    -type 指定要查找的文件的类型
b      block (buffered) special 块设备

              c      character (unbuffered) special 字符设备
d      directory  文件夹
p      named pipe (FIFO) 有名管道
f      regular file 普通文件

              l      symbolic link; this is never true if the -L option or the
-follow  option is in effect, unless the symbolic link is
broken.  If you want to search for symbolic links when -L
is in effect, use -xtype.
s      socket

              D      door (Solaris)

    -size 指定大小
默认以块为单位
-size 5
实际查找文件大小为 5 * 512字节

              `b'    for 512-byte blocks (this is the default if no suffix  is
used)  块

              `c'    for bytes 字节

              `w'    for two-byte words 两个字节

              `k'    for Kibibytes (KiB, units of 1024 bytes)

              `M'    for Mebibytes (MiB, units of 1024 * 1024 = 1048576 bytes)

              `G'    for  Gibibytes  (GiB,  units  of  1024  *  1024  * 1024 =
1073741824 bytes)

    -delete 找到及删除

    -exec commod {} \;
找到及执行 commod 
{}为执行结果的占位符
find ./ -name "*.h" -exec tar -jcvf 1.tar.bz2 {} \; 
找到当前路径下面所有的.h文件,然后将其压缩为 1.tar.bz2

grep:在一个文件里面查找对应的字符串
grep [OPTIONS] PATTERN [FILE...]
FILE你的待匹配的文件路径名
PATTERN : 正则表达式

        OPTIONS:
-n 显示查找到的字符串所在行
-E  用扩展的正则表达式

            -i 忽略大小写

            -# 同时显示匹配的上下#行


-c 打印每个文件匹配行的个数

-H 显示文件名

            -h 不显示文件名

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

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

相关文章

0基础法考随手笔记 03(刑诉05 刑事证据与证明+06 强制措施)

1.如何区分书证和电子数据 书面材料是否为书证&#xff1f;→ 看内容是否直接源于案件事实&#xff08;不是 “记录别人陈述” 的载体&#xff09;。 证据清单是否为证据&#xff1f;→ 看谁做的清单&#xff08;侦查人员做的勘查笔录是证据&#xff0c;当事人做的目录不是&…

资产负债表及其数据获取

文章目录资产负债表及其数据获取资产负债表资产负债表在股票投资中的意义AKShare中的资产负债表数据接口&#xff08;深沪为例&#xff09;接口描述调用示例总结资产负债表及其数据获取 资产负债表 资产负债表&#xff08;Balance Sheet&#xff09;是反映企业在某一特定日期财…

数据仓库深度探索系列 | 开篇:开启数仓建设新征程

数据仓库深度探索系列 | 开篇&#xff1a;开启数仓建设新征程 在当今信息技术飞速发展的背景下&#xff0c;企业面临着数据量的爆炸式增长。企业不仅要高效管理海量数据&#xff0c;还需从中提取关键信息以支持复杂决策。数据仓库已从单纯的数据存储工具&#xff0c;演变为支持…

Linux如何执行系统调用及高效执行系统调用:深入浅出的解析

文章目录如何执行系统调用及高效执行系统调用&#xff1a;深入浅出的解析一、什么是系统调用&#xff1f;1.1 系统调用的作用1.2 系统调用的分类二、如何执行系统调用&#xff1f;2.1 系统调用的触发2.2 库函数与系统调用的关系2.3 系统调用的示例2.4 错误处理三、如何高效执行…

基于 XGBoost 与 SHAP 的医疗自动化办公与可视化系统(上)

摘要 随着信息技术的飞速发展和医疗健康数据的爆炸式增长,现代医疗机构面临着日益复杂的数据处理挑战。医生和行政人员常常需要花费大量时间在数据提取、整理、分析和报告生成等重复性、事务性的工作上,这不仅降低了工作效率,也限制了医护人员将更多精力投入到直接的患者护…

基于Kafka实现简单的延时队列

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之间&…

OceanBase 4.3.5 解析:DDL性能诊断

背景DDL操作通常耗时较长&#xff0c;特别是涉及补数据流程的DDL语句。在执行过程中&#xff0c;用户面临两个主要痛点&#xff1a;一是无法实时获取DDL执行进度&#xff0c;难以区分长时间运行是正常现象还是由内部异常导致的停滞&#xff1b;二是执行效率经常低于预期&#x…

幸福网咖订座点餐小程序的设计与实现

文章目录前言详细视频演示具体实现截图后端框架SpringBoot微信小程序持久层框架MyBaits成功系统案例&#xff1a;参考代码数据库源码获取前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续…

C语言————练习题册(答案版)

目录 每日更新5-10题&#xff0c;感兴趣可以订阅 一.理解函数、操作符、占位符 1.1 欢迎来到C语言的世界 1.2 输入和输出 1.3 浮点数的打印 1.4 字符串的打印 1.14 I am iron man 1.5 求和运算 1.6 计算比例 1.7 求商求余 1.8 不同数位上的数字 1.8.1 求个位数 1.8…

haproxy配置详解

1、haproxy简介 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统计 企业版网站&#xff…

计网-TCP可靠传输

TCP&#xff08;传输控制协议&#xff09;的可靠传输是通过一系列机制保证数据准确、有序、不丢失地到达接收方。以下是TCP可靠传输的详细过程及核心机制&#xff1a;1. 数据分块与序列号&#xff08;Seq&#xff09;分块&#xff1a;应用层数据被分割成适合传输的TCP报文段&am…

数智管理学(三十九)

第三章 数智化对管理理论的冲击第三节 系统理论与生态化管理的强化系统理论作为理解企业运作与环境互动的重要框架&#xff0c;一直强调企业是一个由多个相互关联子系统构成的整体&#xff0c;其核心要素包括整体性、开放性、动态性和反馈机制。在传统管理视角下&#xff0c;这…

哈希表(c语言)

文章目录哈希表哈希表知识点哈希表概念负载因子哈希表的优缺点哈希冲突哈希函数常见哈希函数处理哈希冲突开放定址法线性探测二次探测链地址法哈希表的实现哈希表的核心:HashMap核心函数&#xff1a;从创建到销毁创建哈希表&#xff1a;hashmap_create()销毁哈希表:hashmap_des…

【Canvas与旗帜】条纹版大明三辰旗

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>十三条纹版大明三辰旗 Draft1</title><style type"text/…

【Java】空指针(NullPointerException)异常深度攻坚:从底层原理到架构级防御,老司机的实战经验

写Java代码这些年&#xff0c;空指针异常&#xff08;NullPointerException&#xff09;就像甩不掉的影子。线上排查问题时&#xff0c;十次有八次最后定位到的都是某个对象没处理好null值。但多数人解决问题只停留在加个if (obj ! null)的层面&#xff0c;没从根本上想过为什么…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-评论用户时间占比环形饼状图实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解主页-评论用户时间占比环形饼状图实现 视频…

Redis面试精讲 Day 5:Redis内存管理与过期策略

【Redis面试精讲 Day 5】Redis内存管理与过期策略 开篇 欢迎来到"Redis面试精讲"系列的第5天&#xff01;今天我们将深入探讨Redis内存管理与过期策略&#xff0c;这是面试中经常被问及的核心知识点。对于后端工程师而言&#xff0c;理解Redis如何高效管理内存、处…

ICMPv6报文类型详解表

一、错误报文类型&#xff08;Type 1-127&#xff09;Type值名称Code范围触发条件示例典型用途1Destination Unreachable0-60: 无路由到目标1: 通信被管理员禁止2: 地址不可达3: 端口不可达4: 分片需要但DF标志设置5: 源路由失败6: 目的地址不可达网络故障诊断2Packet Too Big0…

配置nodejs

第一步确认 node.exe 和 npm 存在 例如安装目录D:\nodejs检查是否存在以下文件&#xff1a; node.exenpm.cmdnpx.cmd 第二步&#xff1a;添加环境变量 PATH 图形化操作步骤&#xff08;Windows&#xff09;&#xff1a; 右键「此电脑」→「属性」点击左侧 「高级系统设置」弹出…

MySQL的命令行客户端

MySQL中的一些程序&#xff1a;MySQL在安装完成的时候&#xff0c;一般都会包含如下程序&#xff1a;在Linux系统下&#xff0c;通过/usr/bin目录下&#xff0c;可以通过命令查看&#xff1a;以下是常用的MySQL程序&#xff1a;程序名作用mysqldMySQL的守护进程即MySQL服务器&a…