3-6:常见任务和主要工具之正则表达式
文章目錄
- 一:什么是正則表達(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á)式使用單個(gè)字符串來描述、匹配一系列匹配某個(gè)句法規(guī)則的字符串。正則表達(dá)式是繁瑣的,但它是強(qiáng)大的,學(xué)會(huì)之后的應(yīng)用會(huì)讓你除了提高效率外,會(huì)給你帶來絕對的成就感。只要認(rèn)真閱讀本教程,加上應(yīng)用的時(shí)候進(jìn)行一定的參考,掌握正則表達(dá)式不是問題。許多程序設(shè)計(jì)語言都支持利用正則表達(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代表某個(gè)正則表達(dá)式
下標(biāo)列出了grep的常用選項(xiàng)
比如對如下文件,使用grep搜索
三:元字符和文字
大家可能會(huì)感覺到很奇怪,但是grep的確是在使用正則表達(dá)式。比如上圖中的grep baby test.txt,就是在匹配文本中至少包含4個(gè)字符,存在連續(xù)的,按照b,a,b,y順序組成的字符串的行 其中的bzip都是文本字符,也就是他們只能匹配自己,b只能匹配b,除了文字字符,更多的正則表達(dá)式使用元字符完成更復(fù)雜的匹配操作。
有:^ $ . [ ] { } - ? * + ( ) | \
可以發(fā)現(xiàn),上面很多元字符在shell中具有特殊含義,所以在執(zhí)行時(shí)有時(shí)要用引號避免引起擴(kuò)展
(1)任意字符——.
.這個(gè)元字符用于匹配任意字符
比如grep ".zip" test.txt,表示匹配zip,并且z前面以任意字符開頭
-
注意zip這個(gè)字符并沒有匹配,因?yàn)?zip匹配的是4個(gè)字符
-
而且如果某個(gè)字符中直接包含了.zip,那么也是可以匹配到的,因?yàn)?也會(huì)被當(dāng)做任意字符處理
(2)錨——^和$
^表示開頭,$表示末尾
比如要查找以z開頭,包含zip的行
比如只是要匹配zip
(3)中括號和字符類
簡單點(diǎn)說中括號內(nèi)的字符只要滿足,就可以匹配得到
比如說要匹配bzip或gzip就可以這樣操作
一個(gè)字符集可以包含任意數(shù)目的字符,并且元字符放到中括號時(shí),就會(huì)時(shí)期他們的特殊含義。
有兩種情況,中括號使用元字符時(shí)會(huì)有不同的含義:^在中括號使用時(shí)表示否定,-則表示字符范圍
A:否定
當(dāng)中括號的第一個(gè)字符是^時(shí),那么剩下的字符就表示“不應(yīng)該有”
修改上圖中的例子,就表示匹配那些包含zip字符但是zip前面既不是b也不是g
- 注意如果不把^放在中括號的第一個(gè)位置,那么其否定意義就喪失了,就成為了普通字符
B:傳統(tǒng)字符范圍
如果希望匹配所有以大寫字母開頭的文件,你可以這樣輸入
這樣輸入有沒有錯(cuò)誤?當(dāng)然沒有,但是很明顯太麻煩了,所以我們可以使用-,也就是連字符
如果將連字符放到中括號的第一個(gè)位置,那么連字符就是轉(zhuǎn)化為了普通字符。
C:POSIX字符類
講這個(gè)主題前,先說一個(gè)問題。如下使用兩種方式匹配以任意大寫字母開頭的命令,為什么結(jié)果不一樣,并且相差這么大?
關(guān)于出現(xiàn)這個(gè)問題的原因,書中也做了詳細(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)一次。
舉個(gè)例子,我們知道我們國家手機(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:匹配任意字符多次或零次-*
*是我們最常使用的一個(gè)元字符,它表示匹配任意字符多次。比如我們經(jīng)常在命令行使用rm -f *.txt表示刪除任意字符開頭,任意長度但是以.txt結(jié)尾的文件
舉個(gè)例子,我們都知道QQ郵箱都是以QQ號,也就是數(shù)字開頭并以@qq.com結(jié)尾,那么匹配一個(gè)QQ郵箱的正則表達(dá)式就是grep -E "^[0-9]*@qq.com" test2.txt
C:匹配某元素一次或多次-+
+和?的區(qū)別就是+匹配時(shí)起碼得出現(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ū)號的那個(gè)手機(jī)號無法匹配到
D:以指定次數(shù)匹配某元素
{ }元字符用于描述最小和最大次數(shù)的需求匹配
有如下4種方法指定
這樣的話前面匹配手機(jī)號的那個(gè)就可以簡寫為 grep -E "(\+[0-9]{2})?[0-9]{11}" test.txt,分別表示前面的字符可以出現(xiàn)2次和11次
總結(jié)
以上是生活随笔為你收集整理的3-6:常见任务和主要工具之正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Windows消息钩子的理解与测试项
- 下一篇: ADO.NET教程(一)