4-19 Linux中的正則表達式 --- 字符匹配

1、正則表達式和通配符有點像。區(qū)別在于通配符匹配的是文件名和目錄名中的字符串,不能匹配文本中內容的字符串。而正則表達式匹配的是文本中的字符串。

2、正則表達式(REGEXP):由一類特殊字符及文本符號所編寫的表達式,這種表達式的功能是匹配文本當中字符串。

3、正則表達式的特點:可以通過特殊字符及文本符號靈活組合各種過濾條件去匹配文本內容,從而達到自由度頗高的篩查方式。

4、正則表達式分兩類:基本正則表達式(BRE)、擴展正則表達式(ERE),grep 加上 -E 參數就是使用 egrep。

5、元字符分類:元字符是指正則表達式中使用的特殊字符,這些特殊符號具有特定的功能。從功能上分類有:字符匹配、匹配次數、位置錨定、分組。


  • 字符匹配:
    ①、 .:匹配任意單個字符。
    ②、 [ ]:匹配指定范圍內的任意單個字符。
    ③、 [^]:排除匹配指定范圍內的任意單個字符。
    ④、 [:alnum:]:字母和數字。
    ⑤、 [:alpha:]:任何英文大小寫字符,即 A-Z,a-z。
    ⑥、 [:lower:]:小寫字母。
    ⑦、 [:upper:]:大寫字母。
    ⑧、 [:blank:]:空白字符(空格和制表符)。
    ⑨、 [:space:]:水平和垂直的空白字符(比 [:blank:] 包含的范圍廣)。
    ⑩、 [:cntrl:]:不打印的控制字符(退格、刪除...)。
    ⑩-①、 [:digit:]:十進制數字。
    ⑩-②、 [:xdigit]:十六進制數字。
    ⑩-③、 [:graph:]:可打印的非空白字符。
    ⑩-④、 [:print:]:可打印字符。
    ⑩-⑤、 [:punct:]:標點符號。

①、 .:匹配任意單個字符。

  • 創(chuàng)建一個文檔 regexpTest.txt 。
[root@localhost ~]# vim regexpTest.txt

abc
abbc
abbbc
a.c
a/c
aabcd
aabbcc
                                                                               
~                                                                                       
~                                                                                       
~                                                                                       
:wq    ## 保存退出

  • "a.c":表示過濾 a 與 c 之間夾著一位任意字符的字符串。
a.c:字符串中只要包含 a 與 c 之間有一位任意字符就會被過濾出來
  • "a..c":表示過濾 a 與 c 之間夾著兩位任意一位字符的字符串。
a..c:字符串中只要包含 a 與 c 之間有兩位任意字符就會被過濾出來
  • 漢字也算一個字符,( . )代表任意字符。
[root@localhost ~]# vim regexpTest.txt    ##  regexpTest.txt 添加新內容

abc
abbc
abbbc
a.c
a/c
aabcd
aabbcc
a我c    ## 新字符串                                                                        
~                                                                                                 
~                                                                                                 
~                                                                                                 
:wq        

a我c:字符串 a 與 c 之間包含漢字字符也會被過濾出來
  • "...":表示過濾包含三位的字符串。
  • regexpTest.txt 新增點內容。
[root@localhost ~]# vim regexpTest.txt     ##  regexpTest.txt 添加新內容 

abc
abbc
abbbc
a.c
a/c
aabcd
aabbcc
a我c
a    ## 新增的內容
ab    ## 新增的內容                                                                                           
~                                                                                                 
~                                                                                                 
~                                                                                                 
:wq    ## 保存退出                                  
  • 從輸出結果可以看出不只是過濾出三位的字符串,而是三位以上的字符串都過濾出來了。這是 grep 默認的特性貪婪模式,盡可能的匹配滿足的長度。
只要字符串滿足三位字符就會被過濾出來,(滿三位標紅)
  • "a...":表示過濾包含 a 開頭,后面三位任意的字符。
a 開頭或 a 開頭后面滿足三位任意的字符
  • "..c":表示過濾包含 c 結尾,前面有兩位任意的字符。
..c:c 前面滿足兩位任意字符
  • "a \ .c":\ 轉義字符,轉義之后的。就是 . 本身的含義。不是正則表達式 . 任意單個字符的意思。所以,"a \ .c" 就是過濾出 a.c 的字符串。
\ 轉義字符,轉義之后是字符本身

②、 [ ]:匹配指定范圍內的任意單個字符。

  • "a[qwer我].":a 開頭,第二位 [qwer我] 中括號的內容匹配文本中的字符串第二位,第三位 . 代表任意字符的意思。如果文本中的字符串有 a 開頭,第二位也符合 q、w、e、r、我、的任意一個字符,而且滿足三位的條件,就會打印出來。
文件內容匹配中括號范圍內的任意單個字符圖解
文件內容匹配中括號范圍內的任意單個字符圖解

③、 [^]:排除匹配指定范圍內的任意單個字符。

  • "a[^abc]":a 開頭,第二位 [^abc] 中括號的內容取反,即排除掉。除了中括號內的 a、b、c 字符,匹配其他字符都可以過濾出結果。

④、 [:alnum:]:過濾字母和數字,包含了大寫字母、小寫字母 和 10個數字(0-9)。

  • 更新以下 regexpTest.txt 內容
[root@localhost ~]# vim regexpTest.txt 

---------
loginTest
---------
sn:888888
---------                                                                                               
~                                                                                                 
~                                                                                                 
~                                                                                                 
:wq

  • 由于 [:alunm:] 包含了大寫字母、小寫字母 和 10個數字(0-9)。當用 [ ] 中括號包含 [:alnum:] 就相當于大寫字母、小寫字母 和 10個數字(0-9)匹配文本中的內容。但凡符合要求的都會標紅顯示出來。
[:alnum:]:過濾字母和數字
  • 更改一下 regexpTest.txt 內容,加入一些中文看看 [:alnum:] 過濾的效果如何?
[root@localhost ~]# vim regexpTest.txt 

----------
登錄測試:
Test
----------
測試密碼:
888888
----------                                                                         
~                                                                                                 
~                                                                                                 
~                                                                                                 
:wq                        
  • 從輸出效果看,[:alnum:] 也可以輸出中文。
[:alnum:] 也可以輸出中文
  • [:alnum:] 也可以匹配指定范圍的內容。例如過略 T 開頭,第二位任意小寫字母的內容。
    T[a-z]:T 開頭,第二位 a-z 任意小寫字母作為過濾條件。
    T[[:alnum:]]:T 開頭,第二位 A-Z 大寫字母、a-z 小寫字母 和 10個數字(0-9)作為過濾條件。
過略 T 開頭,第二位任意小寫字母的內容
  • 當然 [:alnum:] 作為一個 A-Z 大寫字母、a-z 小寫字母 和 10個數字(0-9)的過濾條件范圍有點大。第二位只要符合大寫、小寫 和 數字范圍的字符都會被過濾出來。
[:alnum:] 類似一個數據的集合
  • 單純想過略 T 開頭,第二位為任意小寫字母的時候,用 [:alnum:] 顯然不合適。這里只是想記錄一下 [:alnum:] 這類特殊字符本意上類似數據的集合供使用者方便使用 和 寫法上加了 [ ] 中括號的意思。

⑤、 [:alpha:]:任何英文大小寫字符,即 A-Z,a-z。

  • 更改一下 regexpTest.txt 內容。
[root@localhost ~]# vim regexpTest.txt 

------------
大寫英文:                  
ABC                         
------------                
小寫英文:                  
abc                         
------------                                                                            
~                                                                                       
~                                                                                       
~                                                                                       
:wq

[:alpha:] 可以過濾中文字符
  • [:alpha:] 匹配英文大小寫字符,即 A-Z,a-z
[:alpha:] 匹配指定范圍的內容

⑥、 [:lower:]:只過濾小寫字母。

[:lower:]:只過濾小寫字母

⑦、 [:upper:]:只過濾大寫字母。

[:upper:]:只過濾大寫字母

⑧、 [:blank:]:空白字符(空格和制表符)。

  • 更改一下 regexpTest.txt 內容。
[root@localhost ~]# vim regexpTest.txt 

------------
空格(space):                              this's space.
------------
制表符(tab):            this's tab.
------------
                                                           
~                                                                                       
~                                                                                       
~                                                                                       
:wq                                                     
  • 在輸出中用鼠標括住輸出內容就可以看到標紅的部分,分別是 空格space 和 制表符 tab。
[:blank:]:空格和制表符

⑨、 [:space:]:水平和垂直的空白字符(比 [:blank:] 包含的范圍廣)。

[root@localhost ~]# vim regexpTest.txt 

----------
登錄測試:              Test    ## <--- Test 前面有 2 個 tab
----------
測試密碼:      888888    ## <--- Test 前面有 1 個 tab
----------  ## <--- 這里結尾有 1 個空格
                                                                                     
~                                                                                                 
~                                                                                                 
~                                                                                                 
:wq

  • 通過 [:space:] 可以看到過濾出 regexpTest.txt 文件中的空白字符。
[:space:] 過濾空白字符

⑩-①、 [:digit:]:十進制數字。

[:digit:] 顯示所有的數字內容

⑩-③、 [:graph:]:可打印的非空白字符。

[:graph:]:可打印的非空白字符

⑩-④、 [:print:]:可打印字符。相當于 [:alnum:]、[:punct:] 和 space。

  • 從輸出效果看出 [:print:] 可以過濾中文、大小寫英文、數字、標點 和 空格。但是不能過濾 tab。
[:print:] 的效果

⑩-⑤、 [:punct:]:標點符號。

[root@localhost ~]# vim regexpTest.txt 

----------
登錄測試:
Test
----------
測試密碼:
888888
----------
符號測試
----------
` ~ ! @ # $ % ^ & * ( ) _ - + = \ | [ ] { } ; ' : " , . / < > ?
----------       
                                                                           
~                                                                                       
~                                                                                       
~                                                                                       
:wq                                                  
[:punct:]:標點符號
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容