首頁 > 軟體

十分鐘上手正規表示式 上篇

2021-10-13 19:01:34

一、正規表示式的定義:

正規表示式是你所定義的 模式模板 ( pattern template ), Linux 工具可以用它來過濾文字。 Linux工具(比如sed 編輯器或 gawk 程式)能夠在處理資料時使用正規表示式對資料進行模式匹配。如果資料匹配模式,它就會被接受並進一步處理;如果資料不匹配模式,它就會被濾掉。

正規表示式模式匹配資料:

正規表示式模式利用萬用字元來描述資料流中的一個或多個字元。 Linux 中有很多場景都可以 使用萬用字元來描述不確定的資料。【*】號在我們工作中就比較常用。

範例說明:

a.*引數會讓ls命令只列出名字以a開頭的檔案。檔名中a之後可以有任意多個字元(包括什麼也沒有)。ls命令會讀取目錄中所有檔案的資訊,但只顯示跟萬用字元匹配的檔案的資訊。

二、正規表示式的型別

使用正規表示式最大的問題在於有不止一種型別的正規表示式。 Linux 中的不同應用程式可能會用不同型別的正規表示式。這其中包括程式語言(Java 、 Perl 和 Python )、 Linux 實用工具(比 如sed 編輯器、 gawk 程式和 grep 工具)以及主流應用(比如 MySQL 和 PostgreSQL 資料庫伺服器)。正規表示式是通過正規表示式引擎( regular expression engine )實現的。正規表示式引擎是一套底層軟體,負責解釋正規表示式模式並使用這些模式進行文字匹配。

兩種流行的正規表示式引擎:

  • POSIX基礎正規表示式(basic regular expression,BRE)引擎
  • POSIX擴充套件正規表示式(extended regular expression,ERE)引擎

POSIX BRE引擎通常出現在依賴正規表示式進行文字過濾的程式語言中。它為常見模式提供了高階模式符號和特殊符號,比如匹配數位、單詞以及按字母排序的字元。awk程式用ERE引擎來處理它的正規表示式模式。

說明:

由於實現正規表示式的方法太多,很難用一個簡潔的描述來涵蓋所有可能的正規表示式。後面會結合sed和awk演示最常見的正規表示式。

三、定義 BRE 模式

最基本的 BRE模式是匹配資料流中的文字字元。下面會演示如何在正規表示式中定義文字以及會得到什麼樣的結果。

3.1 純文字

演示說明:

模式定義了一個單詞 test 。 sed 編輯器和 gawk 程式指令碼用它們各自的 print 命令列印出匹配該正規表示式模式的所有行。由於echo 語句在文字字串中包含了單詞 test ,資料流文字能夠匹配所定義的正規表示式模式,編輯器能顯示該行。

正規表示式是區分大小寫的:

演示說明:

第一次嘗試沒能匹配成功,因為 this 在字串中並不都是小寫,而第二次嘗試在模式中使 用大寫字母,所以能正常輸出。

在正規表示式中,你不用寫出整個單詞。只要定義的文字出現在資料流中,正規表示式就能 夠匹配。

演示說明:

資料流中的文字是 books ,在資料中含有正規表示式 book ,因此正規表示式模式跟資料匹配。

在正規表示式中,空格和其他的字元並沒有什麼區別。

演示說明:

空格的出現無法和文字內容匹配。

如果在正規表示式中定義了空格,那麼它必須出現在資料流中。甚至可以建立匹配多個連續空格的正規表示式模式。

演示說明:

單詞間有兩個空格的行匹配正規表示式模式。

3.2 特殊字元

正規表示式識別的特殊字元包括:

.*[]^${}+?|()

如果要用某個特殊字元作為文字字元,就必須 跳脫 。在跳脫特殊字元時,你需要在它前面加一個特殊字元反斜槓()來告訴正規表示式引擎應該將接下來的字元當作普通的文字字元。

範例說明:

查詢文字中的美元符,只要在它前面加個反斜線。

3.3 錨字元

預設情況下,當指定一個正規表示式模式時,只要模式出現在資料流中的任何地方,它就能匹配。有兩個特殊字元可以用來將模式鎖定在資料流中的行首或行尾。

3.3.1 鎖定在行首

脫字元( ^ )定義從資料流中文字行的行首開始的模式。如果模式出現在行首之外的位置,正規表示式模式則無法匹配。 要用脫字元,就必須將它放在正規表示式中指定的模式前面。

脫字元會在每個由換行符決定的新資料行的行首檢查模式。

範例解說:

只要模式出現在新行的行首,脫字元就能夠發現它。

演示說明:

脫字元出現在正規表示式模式的尾部,sed編輯器會將它當作普通字元來匹配。

注意:

如果指定正規表示式模式時只用了脫字元,就不需要用反斜線來跳脫。但如果在模式中先指定了脫字元,隨後還有其他一些文字,那麼必須在脫字元前用跳脫字元。

3.3.2 鎖定在行尾

跟在行首查詢模式相反的就是在行尾查詢。特殊字元美元符( $ )定義了行尾錨點。將這個特殊字元放在文字模式之後來指明資料行必須以該文字模式結尾。

3.3.3 組合錨點

在一些常見情況下,可以在同一行中將行首錨點和行尾錨點組合在一起使用。在第一種情況中,假定你要查詢只含有特定文字模式的資料行。

範例說明:

匹配文字中以test開頭和以test結尾的行

將兩個錨點直接組合在一起,之間不加任何文字,這樣過濾出資料流中的空白行。

範例說明:

定義的正規表示式模式會查詢行首和行尾之間什麼都沒有的那些行。由於空白行在兩個換行符之間沒有文字,剛好匹配了正規表示式模式。sed 編輯器用刪除命令 d 來刪除匹配該正規表示式模式的行,因此刪除了文字中的所有空白行。

3.4 點號字元

特殊字元點號用來匹配除換行符之外的任意單個字元。它必須匹配一個字元,如果在點號字元的位置沒有字元,那麼模式就不成立。

範例解說:

這個例子很具有說明性的,為什麼第一行無法匹配,而第二行和第三行就可以。第四行有點複雜。注意, 我們匹配了at,但在at前面並沒有任何字元來匹配點號字元。其實是有的!在正規表示式中, 空格也是字元,因此at前面的空格剛好匹配了該模式。第五行證明了這點,將at放在行首就不 會匹配該模式了。

3.5 字元組

使用方括號來定義一個字元組。方括號中包含所有你希望出現在該字元組中的字元。然後可以在模式中使用整個組,就跟使用其他萬用字元一樣。

範例說明:

匹配這個模式的單詞只有 cat 和 hat 。還要注意以 at 開頭的行也沒有匹配。字元組中必須有個字元來匹配相應的位置。

在不太確定某個字元的大小寫時,字元組會非常有用。如下範例:

字元組不必只含有字母,也可以在其中使用數位。

範例說明:

這個正規表示式模式匹配了任意含有數位 0 、 1 、 2 或 3 的行。含有其他數位以及不含有數位的 行都會被忽略掉。

範例說明:

正規表示式模式可見於資料流中文字的任何位置。經常有匹配模式的字元之外的其他字元。如果要確保只匹配五位數,就必須將匹配的字元和其他字元分開,要麼用空格,要麼像這 個例子中這樣,指明它們就在行首和行尾。

3.6 排除型字元組

在正規表示式模式中,也可以反轉字元組的作用。可以尋找組中沒有的字元,而不是去尋找組中含有的字元。要這麼做的話,只要在字元組的開頭加個脫字元。

範例說明:

使用排除型字元組,正規表示式模式會匹配 c 或 h 之外的任何字元以及文字模式。由於空格字 符屬於這個範圍,它通過了模式匹配。但即使是排除,字元組仍然必須匹配一個字元,所以以 at開頭的行仍然未能匹配模式。

3.7 區間

範例說明:

新的模式 [c-h]at 匹配了首字母在字母 c 和字母 h 之間的單詞。這種情況下,只含有單詞 at 的行將無法匹配該模式。

範例說明:

該字元組允許區間a~c、h~m中的字母出現在at文字前,但不允許出現d~g的字母。

3.8 特殊的字元組

除了定義自己的字元組外, BRE 還包含了一些特殊的字元組,可用來匹配特定型別的字元。

  • [[:alpha:]] 匹配任意字母字元,不管是大寫還是小寫
  • [[:alnum:]] 匹配任意字母數位字元0~9、A~Z或a~z
  • [[:blank:]] 匹配空格或製表符
  • [[:digit:]] 匹配0~9之間的數位
  • [[:lower:]] 匹配小寫字母字元a~z
  • [[:print:]] 匹配任意可列印字元
  • [[:punct:]] 匹配標點符號
  • [[:space:]] 匹配任意空白字元:空格、製表符、NL、FF、VT和CR
  • [[:upper:]] 匹配任意大寫字母字元A~Z

範例說明:

使用特殊字元組可以很方便地定義區間。可以用 [[:digit:]] 來代替區間 [0-9] 。

3.9 星號【*】

在字元后面放置星號表明該字元必須在匹配模式的文字中出現 0 次或多次。

到此這篇關於十分鐘上手正規表示式 上篇的文章就介紹到這了,更多相關正規表示式 入門內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com