第二十天(正則表達式與功能實際運用)

在程序員一生的工作中,遇到的最多的數據就是字符串
字符串里面很有可能有很多的不需要的信息
我們需要從中間挑選出我們需要的
如果循環去寫,比較簡單的時候問題不大
規則多了,你的工作量會成倍上升的
為了解決這個問題 ---- 正則表達式

正則表達式 --- 一種規則,用于匹配我們需要的字符/字符串
簡單一點就是一種匹配規則
字符串的處理通過這個正則表達式會變得簡單很多

正則表達式字符分為兩種
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
英文地址,請注明出處:http://en.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…