Linux Regex基礎
一、Regex簡介
Regex是電腦科學的一個概念。
Regex使用單個字串來描述、匹配一系列匹配某個句法規則的字串。
在很多文字編輯器裡,Regex通常被用來檢索、替換那些匹配某個模式的文本。
摘自:維基百科
Regex在 Linux 系統中無處不在,日常使用的很多命令(如 grep、awk)也跟Regex脫不開關係。
Regex對於某些人來說確實難以理解。
我也只能說:多練吧!想學好的東西,一定可以學會的!
️ 注意
在學習過程中,一定要區分好Regex與萬用字元的關係。千萬不要弄混!
本文為個人學習筆記,僅供參考。如有錯誤請及時提出,謝謝!
二、Regex中的字元
Regex分為一般字元和元字元兩種字元。
形如 a、b、1 這些字元均屬於一般字元,只存在字面上的含義,沒有隱含的意義。
為了方便大家理解,下文中的一般字元均使用空心 ︎ 或實心 ︎ 的小方格來表示。
元字元是指在Regex有著特別意義的字元,比如貨幣符號 $ 表示行尾。
如果需要把元字元當作一般字元來看,請在元字元前面加一個反斜線 \( {、}、<、> 除外)。
另外,在 SHELL 中使用Regex時,最好將Regex用單引號括起來,以免Regex中的某些字元被 SHELL 視為元字元而影響操作。
三、基本Regex
所有支援Regex的程式都相容基本Regex。
| Regex |
含義 |
︎ |
匹配 ︎ 本身 |
. |
匹配任意一個字元 |
︎* |
匹配任意多個 ︎ (包括 0 個) |
[︎︎] |
匹配 ︎ 或 ︎(字元集中的任意一個字元) |
[^︎︎] |
匹配除 ︎ 和 ︎(字元集中的任意一個字元)以外的任意一個字元 |
[A-Z] |
匹配一個大寫字母(小寫字母、數字同理,也可取反) |
^ |
匹配行首 |
$ |
匹配行尾 |
︎\{m\} |
匹配 m 個 ︎ |
︎\{m,n\} |
匹配 m 至 n 個 ︎ |
︎\{m,\} |
匹配至少 m 個 ︎ |
\<︎︎︎︎\> |
精確匹配 ︎︎︎︎ 這個單詞 |
代表性例子
| Regex |
可匹配 |
gooo*gle |
google、goooogle |
c.t |
cut、cat |
aa.*bb |
aabb、aavvsfbb |
^$ |
一個空行 |
\<SSR\> |
SSR |
四、POSIX 標準Regex
POSIX Regex用來匹配字元集中的其中一個字元,它主要用來消除不同字元編碼之間的差異。
比如說某種字元編碼,它的英文字元排序是 ABCDE...,那麼此時可以使用 [A-Z] 來匹配任意一個大寫字母。
那如果某種字元編碼,它的英文字元排序是 AaBbCc...,那麼此時想匹配一個大寫字母就不能再使用 [A-Z] 了。
| Regex |
含義 |
[[:alnum:]] |
匹配一個數字或字母 |
[[:alpha:]] |
匹配一個字母 |
[[:digit:]] |
匹配一個數字 |
[[:upper:]] |
匹配一個大寫字母 |
[[:lower:]] |
匹配一個小寫字母 |
[[:blank:]] |
匹配一個空格或 Tab |
[[:print:]] |
匹配一個可列印字元 |
五、擴充Regex
擴充Regex僅在部分程式中支援,例如 egrep、awk 等。
| Regex |
含義 |
︎|︎ |
匹配 ︎ 或 ︎ |
︎? |
匹配 0 個或 1 個 ︎ |
︎+ |
匹配至少 1 個 ︎ |
︎{m} |
匹配 m 個 ︎ |
︎{m,n} |
匹配 m 至 n 個 ︎ |
︎{m,} |
匹配至少 m 個 ︎ |
(︎︎︎︎) |
匹配 ︎︎︎︎ 這個字串 |
代表性例子
| Regex |
可匹配 |
A|B |
BOO、AAB |
goo+gle |
google、goooogle |
(SS) |
SS、SSR |
六、區分:萬用字元
這裡說一下萬用字元的用法,大家好好區分一下。
| 萬用字元 |
含義 |
* |
匹配任意數量的任一字元 |
? |
匹配 1 個 任一字元 |
[︎︎] |
匹配 ︎ 或 ︎(字元集中的任意一個字元) |
[^︎︎] |
匹配除 ︎ 和 ︎(字元集中的任意一個字元)以外的任意一個字元 |
[A-Z] |
匹配一個大寫字母(小寫字母、數字同理,也可取反) |
{︎,︎} |
匹配括弧內 ︎ 和 ︎ (兩個或多個字串) |