1. 程式人生 > 其它 >一、正則表示式

一、正則表示式

1.1 簡介

shell指令碼語言包含了眾多用於解決Unix/Linux系統問題必不可少的元件,文字處理是shell指令碼擅長的重要領域之一。它可以與sed、awk、grep、cut這類優美的工具組合在一起來解決文字處理問題。

1.2 使用正則表示式

正則表示式是基於模式匹配的文字處理技術的關鍵所在,想要在編寫文字處理工具方面駕輕就熟,你就要對正則表示式有一個基本的概念,萬用字元能夠匹配的文字範圍相當有限,正則表示式是一種用於文字匹配的形式小巧、具有高度針對性的程式語言;

1.2.1 實戰演練

正則表示式是由字面文字和具有特殊意義的符號組成的,我們可以根據具體需求,使用它們構造出合適的正則表示式來匹配文字。因為正則表示式是一種匹配文字的通用語言;

# 要匹配給定文字中的所有單詞,可以使用下面的正則表示式:
(?[a-zA-Z]+ ?) 
"?" 用於匹配單子前後可能出現的空格,[a-zA-Z]+ 代表一個或多個字母(a~z和A~Z)

# 要匹配一個ip地址,可以使用下面的正則表示式:
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
或者
[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}

# 詳解:我們知道ip地址通常的書寫形式是192.168.0.2,它是由點號分割的4個整數(每一個整數的取值範圍從0-255)。[0-9]或[:digit:]匹配數字0-9。{1,3}匹配1到3個數字,\.匹配“.”

注意:這個正則表示式可以匹配所處理文字中的ip地址,但它並不檢測地址的合法性。例如:形如123.300.1.1的ip地址可以被正則表示式匹配,但這卻是一個非法的ip地址。不過在解析文字流時,通常目標僅僅是找出ip地址而已。

1.2.2 工作原理

先看一下正則表示式的基本組成部分

正則表示式 描述 示例
^ 行起始標記 ^tux匹配以tux起始的行
$ 行結尾標記 tux$匹配以tux結尾的行
. 匹配任意一個字元 abc.匹配abc1和abc2,但是不能匹配abc11和abc22
[] 匹配包含在[字元]之中的任意一個字元 coo[kl] 匹配cook或者cool
[^] 匹配除[^字元] 之外的任意一個字元 9[^01] 匹配到92或93,但是不能匹配到90或91
[-] 匹配[] 中指定範圍內的任意一個字元 [1-5] 匹配從1~5的任意一個字元
? 匹配之前的項1次或0次 colou?r 匹配color或colour,但不能匹配colouur
+ 匹配之前的項1次或多次 nihao-1+ 匹配nihao-11、nihao-1,但是不能匹配nihao-
* 匹配之前的項0從或多次 co*l 匹配cl、col、coool等
() 建立之前的項n次 ma(tri)?x 匹配max或maxtrix
{n} 匹配之前的項n次 [0-9]{3} 匹配任意一個三位數,[0-9]{3} 可以擴充套件為[0-9][0-9][0-9]
{n,} 之前的項至少需要匹配n次 [0-9]{2,} 匹配任意一個兩位或者更多的數字
{n,m} 指定之前的項所必須匹配的最小次數和最大次數 [0-9]{2,5} 匹配從兩位數到五位數之間的任意一個數字
| 交替——匹配 | 兩邊的任意一項 Oct (1st | 2nd) 匹配Oct 1st 或 Oct 2nd
\ 轉義符可以將上面介紹的特殊字元進行轉義 a\.b匹配a.b,但不能匹配ajb。通過在.之間加上字首 \.從而忽略了.的特殊意義

1.2.3 補充內容

1. 處理特殊字元
正則表示式用$、^、.、*、+、{以及} 等作為特殊字元。但是如果我們希望將這些字元作為非特殊字元(表示普通字母含義的字元),應該怎麼做?
例子:a.txt
它會匹配字元a,然後是任意字元,接著是字串txt。但是我們系統“.”能夠匹配字面意義上的'.',而非任意字元。所以我們在這個字元之前加上一個反斜槓\(這叫做“將該字元進行轉義”)。這表明正則表示式希望匹配的是字面字元,而不是它所代表的特殊含義。因此,最終的正則表示式就變成了a.txt

2. 視覺化正則表示式
正則表示式有時候很難理解,但是人們更易於理解帶有圖示的事物,因此就出現了一些將正則表示式進行視覺化的工具。https://regexper.com