日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3-6:常见任务和主要工具之正则表达式

發(fā)布時間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3-6:常见任务和主要工具之正则表达式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一:什么是正則表達(dá)式
  • 二:grep-文本搜索
  • 三:元字符和文字
    • (1)任意字符——.
    • (2)錨——^和$
    • (3)中括號和字符類
      • A:否定
      • B:傳統(tǒng)字符范圍
      • C:POSIX字符類
    • (4)或和組合
    • (5)限定符
      • A:匹配元素0次或者是1次-?
      • B:匹配任意字符多次或零次-*
      • C:匹配某元素一次或多次-+
      • D:以指定次數(shù)匹配某元素

一:什么是正則表達(dá)式

正則表達(dá)式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。
正則表達(dá)式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。正則表達(dá)式是繁瑣的,但它是強(qiáng)大的,學(xué)會之后的應(yīng)用會讓你除了提高效率外,會給你帶來絕對的成就感。只要認(rèn)真閱讀本教程,加上應(yīng)用的時候進(jìn)行一定的參考,掌握正則表達(dá)式不是問題。許多程序設(shè)計語言都支持利用正則表達(dá)式進(jìn)行字符串操作。

二:grep-文本搜索

正如Python中的正則表達(dá)式工具可以用到re.match一樣,在Linux中用來處理正則表達(dá)式的主要程序是grep。實(shí)際上,grep搜索文本文件中與指定正則表達(dá)式匹配的行,并將結(jié)果輸出到標(biāo)準(zhǔn)輸出。

grep程序按照如下方式接受選項(xiàng)和參數(shù)
grep [options] regex [file],其中regex代表某個正則表達(dá)式
下標(biāo)列出了grep的常用選項(xiàng)

比如對如下文件,使用grep搜索

三:元字符和文字

大家可能會感覺到很奇怪,但是grep的確是在使用正則表達(dá)式。比如上圖中的grep baby test.txt,就是在匹配文本中至少包含4個字符,存在連續(xù)的,按照b,a,b,y順序組成的字符串的行 其中的bzip都是文本字符,也就是他們只能匹配自己,b只能匹配b,除了文字字符,更多的正則表達(dá)式使用元字符完成更復(fù)雜的匹配操作。

有:^ $ . [ ] { } - ? * + ( ) | \

可以發(fā)現(xiàn),上面很多元字符在shell中具有特殊含義,所以在執(zhí)行時有時要用引號避免引起擴(kuò)展

(1)任意字符——.

.這個元字符用于匹配任意字符

比如grep ".zip" test.txt,表示匹配zip,并且z前面以任意字符開頭

  • 注意zip這個字符并沒有匹配,因?yàn)?zip匹配的是4個字符

  • 而且如果某個字符中直接包含了.zip,那么也是可以匹配到的,因?yàn)?也會被當(dāng)做任意字符處理

(2)錨——^和$

^表示開頭,$表示末尾

比如要查找以z開頭,包含zip的行

比如只是要匹配zip

(3)中括號和字符類

簡單點(diǎn)說中括號內(nèi)的字符只要滿足,就可以匹配得到
比如說要匹配bzip或gzip就可以這樣操作

一個字符集可以包含任意數(shù)目的字符,并且元字符放到中括號時,就會時期他們的特殊含義。
有兩種情況,中括號使用元字符時會有不同的含義:^在中括號使用時表示否定,-則表示字符范圍

A:否定

當(dāng)中括號的第一個字符是^時,那么剩下的字符就表示“不應(yīng)該有”
修改上圖中的例子,就表示匹配那些包含zip字符但是zip前面既不是b也不是g

  • 注意如果不把^放在中括號的第一個位置,那么其否定意義就喪失了,就成為了普通字符

B:傳統(tǒng)字符范圍

如果希望匹配所有以大寫字母開頭的文件,你可以這樣輸入

這樣輸入有沒有錯誤?當(dāng)然沒有,但是很明顯太麻煩了,所以我們可以使用-,也就是連字符

如果將連字符放到中括號的第一個位置,那么連字符就是轉(zhuǎn)化為了普通字符。

C:POSIX字符類

講這個主題前,先說一個問題。如下使用兩種方式匹配以任意大寫字母開頭的命令,為什么結(jié)果不一樣,并且相差這么大?

關(guān)于出現(xiàn)這個問題的原因,書中也做了詳細(xì)的介紹

所以為了解決這樣的問題,POSIX標(biāo)準(zhǔn)包含了許多標(biāo)準(zhǔn)字符類,這些字符類提供了一些很有用的字符范圍


于是這里我們可以使用他們來進(jìn)行匹配

POSIX規(guī)范將正則表達(dá)式分為了基本正則表達(dá)式(BRE)和擴(kuò)展正則表達(dá)式(ERE)兩類,到目前為止,我們所討論的正則表達(dá)式的所有特性,都得到了兼容POSIX的應(yīng)用程序的支持,并且都是以BRE的方式實(shí)現(xiàn)的(比如說grep)
在BRE中,只承認(rèn)^ $ . [ ] *是元字符,其他字符一律被視為文字字符,而在ERE中,添加了( ) { } ? + |等元字符

所以以下討論的選項(xiàng)中,grep要加上-e選項(xiàng),依次支持這些元字符

(4)或和組合

| 表示或,用于從字符串集或正則表達(dá)式集中尋找匹配項(xiàng)
如下命令含義是匹配字符串AAA或字符串BBB

()的意思是組合,比如說grep -E "^bz|gz|zip" file.txt,表示匹配以bz或者是包含gz和zip的行,而grep -E" ^(bz|gz|zip)" file.txt則表示匹配以bz開頭或gz開頭或zip開頭的行

(5)限定符

A:匹配元素0次或者是1次-?

?的意思是前面的字符可以不出現(xiàn),但是出現(xiàn)的話只能出現(xiàn)一次。
舉個例子,我們知道我們國家手機(jī)號可以寫作+8613930681613,也可以寫作13930681613,這意味著前面國家地區(qū)號可以不出現(xiàn),所以出現(xiàn)可以書寫正則表達(dá)式如下grep -E "(\+[0-9][0-9])?[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" test.txt,其中“+”是元字符,所以要進(jìn)行轉(zhuǎn)義,?之前表示括號內(nèi)的可以不出現(xiàn),但是出現(xiàn)只能出現(xiàn)1次

如下,兩種手機(jī)號都被匹配到了

B:匹配任意字符多次或零次-*

*是我們最常使用的一個元字符,它表示匹配任意字符多次。比如我們經(jīng)常在命令行使用rm -f *.txt表示刪除任意字符開頭,任意長度但是以.txt結(jié)尾的文件

舉個例子,我們都知道QQ郵箱都是以QQ號,也就是數(shù)字開頭并以@qq.com結(jié)尾,那么匹配一個QQ郵箱的正則表達(dá)式就是grep -E "^[0-9]*@qq.com" test2.txt

C:匹配某元素一次或多次-+

+和?的區(qū)別就是+匹配時起碼得出現(xiàn)1次。grep -E "(\+[0-9][0-9])?[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" test.txt將其改為grep -E "(\+[0-9][0-9])+[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" test.txt,這將導(dǎo)致沒有國際區(qū)號的那個手機(jī)號無法匹配到

D:以指定次數(shù)匹配某元素

{ }元字符用于描述最小和最大次數(shù)的需求匹配
有如下4種方法指定

這樣的話前面匹配手機(jī)號的那個就可以簡寫為 grep -E "(\+[0-9]{2})?[0-9]{11}" test.txt,分別表示前面的字符可以出現(xiàn)2次和11次

總結(jié)

以上是生活随笔為你收集整理的3-6:常见任务和主要工具之正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。