4-19 Linux中的正則表達(dá)式 --- 字符匹配

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

2、正則表達(dá)式(REGEXP):由一類(lèi)特殊字符及文本符號(hào)所編寫(xiě)的表達(dá)式,這種表達(dá)式的功能是匹配文本當(dāng)中字符串。

3、正則表達(dá)式的特點(diǎn):可以通過(guò)特殊字符及文本符號(hào)靈活組合各種過(guò)濾條件去匹配文本內(nèi)容,從而達(dá)到自由度頗高的篩查方式。

4、正則表達(dá)式分兩類(lèi):基本正則表達(dá)式(BRE)、擴(kuò)展正則表達(dá)式(ERE),grep 加上 -E 參數(shù)就是使用 egrep。

5、元字符分類(lèi):元字符是指正則表達(dá)式中使用的特殊字符,這些特殊符號(hào)具有特定的功能。從功能上分類(lèi)有:字符匹配、匹配次數(shù)、位置錨定、分組。


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

①、 .:匹配任意單個(gè)字符。

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

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

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

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

a我c:字符串 a 與 c 之間包含漢字字符也會(huì)被過(guò)濾出來(lái)
  • "...":表示過(guò)濾包含三位的字符串。
  • regexpTest.txt 新增點(diǎn)內(nèi)容。
[root@localhost ~]# vim regexpTest.txt     ##  regexpTest.txt 添加新內(nèi)容 

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

②、 [ ]:匹配指定范圍內(nèi)的任意單個(gè)字符。

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

③、 [^]:排除匹配指定范圍內(nèi)的任意單個(gè)字符。

  • "a[^abc]":a 開(kāi)頭,第二位 [^abc] 中括號(hào)的內(nèi)容取反,即排除掉。除了中括號(hào)內(nèi)的 a、b、c 字符,匹配其他字符都可以過(guò)濾出結(jié)果。

④、 [:alnum:]:過(guò)濾字母和數(shù)字,包含了大寫(xiě)字母、小寫(xiě)字母 和 10個(gè)數(shù)字(0-9)。

  • 更新以下 regexpTest.txt 內(nèi)容
[root@localhost ~]# vim regexpTest.txt 

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

  • 由于 [:alunm:] 包含了大寫(xiě)字母、小寫(xiě)字母 和 10個(gè)數(shù)字(0-9)。當(dāng)用 [ ] 中括號(hào)包含 [:alnum:] 就相當(dāng)于大寫(xiě)字母、小寫(xiě)字母 和 10個(gè)數(shù)字(0-9)匹配文本中的內(nèi)容。但凡符合要求的都會(huì)標(biāo)紅顯示出來(lái)。
[:alnum:]:過(guò)濾字母和數(shù)字
  • 更改一下 regexpTest.txt 內(nèi)容,加入一些中文看看 [:alnum:] 過(guò)濾的效果如何?
[root@localhost ~]# vim regexpTest.txt 

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

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

  • 更改一下 regexpTest.txt 內(nèi)容。
[root@localhost ~]# vim regexpTest.txt 

------------
大寫(xiě)英文:                  
ABC                         
------------                
小寫(xiě)英文:                  
abc                         
------------                                                                            
~                                                                                       
~                                                                                       
~                                                                                       
:wq

[:alpha:] 可以過(guò)濾中文字符
  • [:alpha:] 匹配英文大小寫(xiě)字符,即 A-Z,a-z
[:alpha:] 匹配指定范圍的內(nèi)容

⑥、 [:lower:]:只過(guò)濾小寫(xiě)字母。

[:lower:]:只過(guò)濾小寫(xiě)字母

⑦、 [:upper:]:只過(guò)濾大寫(xiě)字母。

[:upper:]:只過(guò)濾大寫(xiě)字母

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

  • 更改一下 regexpTest.txt 內(nèi)容。
[root@localhost ~]# vim regexpTest.txt 

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

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

[root@localhost ~]# vim regexpTest.txt 

----------
登錄測(cè)試:              Test    ## <--- Test 前面有 2 個(gè) tab
----------
測(cè)試密碼:      888888    ## <--- Test 前面有 1 個(gè) tab
----------  ## <--- 這里結(jié)尾有 1 個(gè)空格
                                                                                     
~                                                                                                 
~                                                                                                 
~                                                                                                 
:wq

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

⑩-①、 [:digit:]:十進(jìn)制數(shù)字。

[:digit:] 顯示所有的數(shù)字內(nèi)容

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

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

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

  • 從輸出效果看出 [:print:] 可以過(guò)濾中文、大小寫(xiě)英文、數(shù)字、標(biāo)點(diǎn) 和 空格。但是不能過(guò)濾 tab。
[:print:] 的效果

⑩-⑤、 [:punct:]:標(biāo)點(diǎn)符號(hào)。

[root@localhost ~]# vim regexpTest.txt 

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容