一、正則表達(dá)式的定義:
正則表達(dá)式是你所定義的 模式模板 ( pattern template ), Linux 工具可以用它來(lái)過(guò)濾文本。 Linux工具(比如sed 編輯器或 gawk 程序)能夠在處理數(shù)據(jù)時(shí)使用正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行模式匹配。如果數(shù)據(jù)匹配模式,它就會(huì)被接受并進(jìn)一步處理;如果數(shù)據(jù)不匹配模式,它就會(huì)被濾掉。
正則表達(dá)式模式匹配數(shù)據(jù):
正則表達(dá)式模式利用通配符來(lái)描述數(shù)據(jù)流中的一個(gè)或多個(gè)字符。 Linux 中有很多場(chǎng)景都可以 使用通配符來(lái)描述不確定的數(shù)據(jù)。【*】號(hào)在我們工作中就比較常用。
示例說(shuō)明:
a.*參數(shù)會(huì)讓ls命令只列出名字以a開(kāi)頭的文件。文件名中a之后可以有任意多個(gè)字符(包括什么也沒(méi)有)。ls命令會(huì)讀取目錄中所有文件的信息,但只顯示跟通配符匹配的文件的信息。
二、正則表達(dá)式的類(lèi)型
使用正則表達(dá)式最大的問(wèn)題在于有不止一種類(lèi)型的正則表達(dá)式。 Linux 中的不同應(yīng)用程序可能會(huì)用不同類(lèi)型的正則表達(dá)式。這其中包括編程語(yǔ)言(Java 、 Perl 和 Python )、 Linux 實(shí)用工具(比 如sed 編輯器、 gawk 程序和 grep 工具)以及主流應(yīng)用(比如 MySQL 和 PostgreSQL 數(shù)據(jù)庫(kù)服務(wù)器)。正則表達(dá)式是通過(guò)正則表達(dá)式引擎( regular expression engine )實(shí)現(xiàn)的。正則表達(dá)式引擎是一套底層軟件,負(fù)責(zé)解釋正則表達(dá)式模式并使用這些模式進(jìn)行文本匹配。
兩種流行的正則表達(dá)式引擎:
- POSIX基礎(chǔ)正則表達(dá)式(basic regular expression,BRE)引擎
- POSIX擴(kuò)展正則表達(dá)式(extended regular expression,ERE)引擎
POSIX BRE引擎通常出現(xiàn)在依賴(lài)正則表達(dá)式進(jìn)行文本過(guò)濾的編程語(yǔ)言中。它為常見(jiàn)模式提供了高級(jí)模式符號(hào)和特殊符號(hào),比如匹配數(shù)字、單詞以及按字母排序的字符。awk程序用ERE引擎來(lái)處理它的正則表達(dá)式模式。
說(shuō)明:
由于實(shí)現(xiàn)正則表達(dá)式的方法太多,很難用一個(gè)簡(jiǎn)潔的描述來(lái)涵蓋所有可能的正則表達(dá)式。后面會(huì)結(jié)合sed和awk演示最常見(jiàn)的正則表達(dá)式。
三、定義 BRE 模式
最基本的 BRE模式是匹配數(shù)據(jù)流中的文本字符。下面會(huì)演示如何在正則表達(dá)式中定義文本以及會(huì)得到什么樣的結(jié)果。
3.1 純文本
演示說(shuō)明:
模式定義了一個(gè)單詞 test 。 sed 編輯器和 gawk 程序腳本用它們各自的 print 命令打印出匹配該正則表達(dá)式模式的所有行。由于echo 語(yǔ)句在文本字符串中包含了單詞 test ,數(shù)據(jù)流文本能夠匹配所定義的正則表達(dá)式模式,編輯器能顯示該行。
正則表達(dá)式是區(qū)分大小寫(xiě)的:
演示說(shuō)明:
第一次嘗試沒(méi)能匹配成功,因?yàn)?this 在字符串中并不都是小寫(xiě),而第二次嘗試在模式中使 用大寫(xiě)字母,所以能正常輸出。
在正則表達(dá)式中,你不用寫(xiě)出整個(gè)單詞。只要定義的文本出現(xiàn)在數(shù)據(jù)流中,正則表達(dá)式就能 夠匹配。
演示說(shuō)明:
數(shù)據(jù)流中的文本是 books ,在數(shù)據(jù)中含有正則表達(dá)式 book ,因此正則表達(dá)式模式跟數(shù)據(jù)匹配。
在正則表達(dá)式中,空格和其他的字符并沒(méi)有什么區(qū)別。
演示說(shuō)明:
空格的出現(xiàn)無(wú)法和文本內(nèi)容匹配。
如果在正則表達(dá)式中定義了空格,那么它必須出現(xiàn)在數(shù)據(jù)流中。甚至可以創(chuàng)建匹配多個(gè)連續(xù)空格的正則表達(dá)式模式。
演示說(shuō)明:
單詞間有兩個(gè)空格的行匹配正則表達(dá)式模式。
3.2 特殊字符
正則表達(dá)式識(shí)別的特殊字符包括:
.*[]^${}+?|()
如果要用某個(gè)特殊字符作為文本字符,就必須 轉(zhuǎn)義 。在轉(zhuǎn)義特殊字符時(shí),你需要在它前面加一個(gè)特殊字符反斜杠()來(lái)告訴正則表達(dá)式引擎應(yīng)該將接下來(lái)的字符當(dāng)作普通的文本字符。
示例說(shuō)明:
查找文本中的美元符,只要在它前面加個(gè)反斜線(xiàn)。
3.3 錨字符
默認(rèn)情況下,當(dāng)指定一個(gè)正則表達(dá)式模式時(shí),只要模式出現(xiàn)在數(shù)據(jù)流中的任何地方,它就能匹配。有兩個(gè)特殊字符可以用來(lái)將模式鎖定在數(shù)據(jù)流中的行首或行尾。
3.3.1 鎖定在行首
脫字符( ^ )定義從數(shù)據(jù)流中文本行的行首開(kāi)始的模式。如果模式出現(xiàn)在行首之外的位置,正則表達(dá)式模式則無(wú)法匹配。 要用脫字符,就必須將它放在正則表達(dá)式中指定的模式前面。
脫字符會(huì)在每個(gè)由換行符決定的新數(shù)據(jù)行的行首檢查模式。
示例解說(shuō):
只要模式出現(xiàn)在新行的行首,脫字符就能夠發(fā)現(xiàn)它。
演示說(shuō)明:
脫字符出現(xiàn)在正則表達(dá)式模式的尾部,sed編輯器會(huì)將它當(dāng)作普通字符來(lái)匹配。
注意:
如果指定正則表達(dá)式模式時(shí)只用了脫字符,就不需要用反斜線(xiàn)來(lái)轉(zhuǎn)義。但如果在模式中先指定了脫字符,隨后還有其他一些文本,那么必須在脫字符前用轉(zhuǎn)義字符。
3.3.2 鎖定在行尾
跟在行首查找模式相反的就是在行尾查找。特殊字符美元符( $ )定義了行尾錨點(diǎn)。將這個(gè)特殊字符放在文本模式之后來(lái)指明數(shù)據(jù)行必須以該文本模式結(jié)尾。
3.3.3 組合錨點(diǎn)
在一些常見(jiàn)情況下,可以在同一行中將行首錨點(diǎn)和行尾錨點(diǎn)組合在一起使用。在第一種情況中,假定你要查找只含有特定文本模式的數(shù)據(jù)行。
示例說(shuō)明:
匹配文本中以test開(kāi)頭和以test結(jié)尾的行
將兩個(gè)錨點(diǎn)直接組合在一起,之間不加任何文本,這樣過(guò)濾出數(shù)據(jù)流中的空白行。
示例說(shuō)明:
定義的正則表達(dá)式模式會(huì)查找行首和行尾之間什么都沒(méi)有的那些行。由于空白行在兩個(gè)換行符之間沒(méi)有文本,剛好匹配了正則表達(dá)式模式。sed 編輯器用刪除命令 d 來(lái)刪除匹配該正則表達(dá)式模式的行,因此刪除了文本中的所有空白行。
3.4 點(diǎn)號(hào)字符
特殊字符點(diǎn)號(hào)用來(lái)匹配除換行符之外的任意單個(gè)字符。它必須匹配一個(gè)字符,如果在點(diǎn)號(hào)字符的位置沒(méi)有字符,那么模式就不成立。
示例解說(shuō):
這個(gè)例子很具有說(shuō)明性的,為什么第一行無(wú)法匹配,而第二行和第三行就可以。第四行有點(diǎn)復(fù)雜。注意, 我們匹配了at,但在at前面并沒(méi)有任何字符來(lái)匹配點(diǎn)號(hào)字符。其實(shí)是有的!在正則表達(dá)式中, 空格也是字符,因此at前面的空格剛好匹配了該模式。第五行證明了這點(diǎn),將at放在行首就不 會(huì)匹配該模式了。
3.5 字符組
使用方括號(hào)來(lái)定義一個(gè)字符組。方括號(hào)中包含所有你希望出現(xiàn)在該字符組中的字符。然后可以在模式中使用整個(gè)組,就跟使用其他通配符一樣。
示例說(shuō)明:
匹配這個(gè)模式的單詞只有 cat 和 hat 。還要注意以 at 開(kāi)頭的行也沒(méi)有匹配。字符組中必須有個(gè)字符來(lái)匹配相應(yīng)的位置。
在不太確定某個(gè)字符的大小寫(xiě)時(shí),字符組會(huì)非常有用。如下示例:
字符組不必只含有字母,也可以在其中使用數(shù)字。
示例說(shuō)明:
這個(gè)正則表達(dá)式模式匹配了任意含有數(shù)字 0 、 1 、 2 或 3 的行。含有其他數(shù)字以及不含有數(shù)字的 行都會(huì)被忽略掉。
示例說(shuō)明:
正則表達(dá)式模式可見(jiàn)于數(shù)據(jù)流中文本的任何位置。經(jīng)常有匹配模式的字符之外的其他字符。如果要確保只匹配五位數(shù),就必須將匹配的字符和其他字符分開(kāi),要么用空格,要么像這 個(gè)例子中這樣,指明它們就在行首和行尾。
3.6 排除型字符組
在正則表達(dá)式模式中,也可以反轉(zhuǎn)字符組的作用。可以尋找組中沒(méi)有的字符,而不是去尋找組中含有的字符。要這么做的話(huà),只要在字符組的開(kāi)頭加個(gè)脫字符。
示例說(shuō)明:
使用排除型字符組,正則表達(dá)式模式會(huì)匹配 c 或 h 之外的任何字符以及文本模式。由于空格字 符屬于這個(gè)范圍,它通過(guò)了模式匹配。但即使是排除,字符組仍然必須匹配一個(gè)字符,所以以 at開(kāi)頭的行仍然未能匹配模式。
3.7 區(qū)間
示例說(shuō)明:
新的模式 [c-h]at 匹配了首字母在字母 c 和字母 h 之間的單詞。這種情況下,只含有單詞 at 的行將無(wú)法匹配該模式。
示例說(shuō)明:
該字符組允許區(qū)間a~c、h~m中的字母出現(xiàn)在at文本前,但不允許出現(xiàn)d~g的字母。
3.8 特殊的字符組
除了定義自己的字符組外, BRE 還包含了一些特殊的字符組,可用來(lái)匹配特定類(lèi)型的字符。
- [[:alpha:]] 匹配任意字母字符,不管是大寫(xiě)還是小寫(xiě)
- [[:alnum:]] 匹配任意字母數(shù)字字符0~9、A~Z或a~z
- [[:blank:]] 匹配空格或制表符
- [[:digit:]] 匹配0~9之間的數(shù)字
- [[:lower:]] 匹配小寫(xiě)字母字符a~z
- [[:print:]] 匹配任意可打印字符
- [[:punct:]] 匹配標(biāo)點(diǎn)符號(hào)
- [[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR
- [[:upper:]] 匹配任意大寫(xiě)字母字符A~Z
示例說(shuō)明:
使用特殊字符組可以很方便地定義區(qū)間。可以用 [[:digit:]] 來(lái)代替區(qū)間 [0-9] 。
3.9 星號(hào)【*】
在字符后面放置星號(hào)表明該字符必須在匹配模式的文本中出現(xiàn) 0 次或多次。
到此這篇關(guān)于十分鐘上手正則表達(dá)式 上篇的文章就介紹到這了,更多相關(guān)正則表達(dá)式 入門(mén)內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/qq_26442553/article/details/120671198