一、正則表示式
阿新 • • 發佈:2021-08-21
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