練習正則表達式

    正則表達式可以通過元字符(規則)來匹配查找相關的的字符集合。他與通配符是有區別的。而且相關的使用工具對正則表示的元字符的是有區別的。

    首先我們先來了解下常用的元字符及含義(并不是所有的元字符)

字符匹配      
         .(點)一個任意字符,回車符換行符除外
         [ ]匹配所包含的任意一個字符
         [^xyz]負值字符集合。匹配未包含的任意字符。        
         [a-z]字符范圍。匹配指定范圍內的任意字符。        
             注意:只有連字符在字符組內部時,并且出現在兩個字符之間時,才能表示字符的范圍;        
             如果出字符組的開頭,則只能表示連字符本身.        
         [^a-z]^表示取反;匹配不在指定范圍內的任意一個字符。        
         [:space:] 一個空白字符        
         [:punct:] 一個(所有)標點符號        
         [:lower:] 一個小寫字母 [a-z]  不能寫成[z-a]        
         [:upper:] 一個大寫字母 [A-Z]        
         [:digit:]  一個數字    [0-9]        
         [:alnum:] 一個數字和字母 [A-Z0-9a-z]        
         [:alpha:]  一個大小寫字母 [a-zA-Z]
位置錨定
        ^ 匹配輸入字符串的開始位置。行首  寫在左側
        $匹配輸入字符串的結束位置。寫在行尾
        \b匹配一個單詞邊界,
        \B匹配非單詞邊界。
        \< \>匹配詞(word)的開始(\<)和結束(\>)。
重疊次數
        *匹配前面的子表達式、字符零次或多次(大于等于0次)。
        +匹配前面的子表達式一次或多次(大于等于1次)
        ?匹配前面的子表達式零次或一次。(基本表達式需要轉意 \)
        {n}前面字符匹配n次。 (基本表達式需要轉意 \)
        {n,}至少匹配n次,至多不管啊   (基本表達式需要轉意 \)
        {n,m}其中n<=m。最少匹配n次且最多匹配m次。  (基本表達式需要轉意 \ )
特殊功能
        ( ) 將 \( 和 \) 之間的表達式定義為“組”(group),并將匹配到的字符保存到一個臨時區域
       (一個正則表達式中最多可以保存9個),可以用 \1 到\9 的符號來引用。分組中的模式匹配到的內容,
        可由正則表達式引擎記憶在內存中,之后可被引用有編號:自左而后的左括號,以及與其匹配右括號
        (基本表達式需要轉意 \)
        \n引用第n個括號所匹配到的內容,而非模式本身
        |將兩個匹配條件進行邏輯“或”(Or)運算。擴展正則表達式
        \轉義符號,把后面的字符特殊的轉為普通,普通的轉為特殊

   這上面的這些字符沒有別的辦法就是記住和理解,其實就是規則文字游戲并不是一開始接觸時候的時候所認認為的那么難。重要的是先對單個元字符去實驗下然后再去組合。綜合而言正則表達式就是計算機所能識別的并被人類所能操作的一種語言,他有很多組合方式來實現你所想要的功能。

    使用正則表達式之前首先肯定是有需求或者說是目標,然后分析組合匹配規則。在這里我感覺還是使用擴展正則表達式的好,無需糾結。

    首先準備一串字符,我放在了/tmp/ceshi

    130 120 200 450 12 24 70 140 8000 30
    30 120 200 450 12 24 170 140 80
    78 30 1800 200 450 12 24 170 40 80
    30 1800 200 450 120 24 170 40 70 70 70
    389 30 1800 200 450 120 24 1000 40 70
    30 30 1800 200 450 120 24 1000 40 70
    130120 200 450122470140800030
    30120200450122417014080
    7830180020045012241704080
    3018002004501202417040707070
    3893018002004501202410004070
    303018002004501202410004070

 匹配下以30開頭中間必須含有70的字符串:

    1、單個匹配以30為開頭:需要做行首錨定^30

    2、單個含有70: 70 

    3、組合匹配需要注意中間30和70之間是可以經過任意字符的.*

    ^30.*70

    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "^30.*70"
    30 120 200 450 12 24 170 140 80
    30 1800 200 450 120 24 170 40 70 70 70
    30 30 1800 200 450 120 24 1000 40 70
    30120200450122417014080
    3018002004501202417040707070
    303018002004501202410004070

   

 匹配下以30開頭中間必須包含1800以70結尾的字符串:

    還是同樣的步驟分析幾個重要的點

    1、30開頭:^30

    2、中間必須包含1800: 1800前后都有可能存在字符 .*1800.*

    3、以70結尾:70$

    ^30.*1800.*70$

    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "^30.*1800.*70$"
    30 1800 200 450 120 24 170 40 70 70 70
    30 30 1800 200 450 120 24 1000 40 70
    3018002004501202417040707070
    303018002004501202410004070
    要求30后面需要跟一個空白字符呢?
    要求30后面需要跟上1或者3呢?   
    ^30[ ].*1800.*70$
    ^30[1|3].*1800.*70$

 再來試幾個簡單的實例

 1、要求70 至少出現2次最多出現3次

    我們需要用到{n,m}其中n<=m。最少匹配n次且最多匹配m次。

    70{2,3}是這樣嗎?我們來試試

    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "70{2,3}"
    [root@zhuzw-centos6 tmp]# echo $?
    1

    執行錯誤了為什么呢?仔細看看元字符你會發現它們基本上都是針對單個字符.

    70{2,3}實際表示的意思應該是700|7000.

    那么我們如何匹配多個字符呢?這就用到了().

    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "(70){2,3}"
    3018002004501202417040707070

    這里需要注意下\n 匹配的是()里面的匹配處來的內容而不是里面的子表達式

    n從外圈開始計算,最外圈的為1

    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "(6(7(\<200\>)))*.*\3?.*[ ]70$"
    30 1800 200 450 120 24 170 40 70 70 70
    389 30 1800 200 450 120 24 1000 40 70
    30 30 1800 200 450 120 24 1000 40 70
    [root@zhuzw-centos6 tmp]# A400=200
    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "(6(7(\<`echo A400`\>)))*.*\3?.*[ ]70$"
    30 1800 200 450 120 24 170 40 70 70 70
    389 30 1800 200 450 120 24 1000 40 70
    30 30 1800 200 450 120 24 1000 40 70

    2、+和?這兩個元字符其實用法跟{n,m}是一樣的

    +可以寫成{1,}至少出現1次,m不賦值表示無限制,但是不許符合n的要求。

    ?可以寫成{0,1}

    對于 \B  \b \< \>呢你可以把上面字符中被空白字符隔開的一組數字看成是一個單詞。

    \B200\B  \b200\b \<200\> 的區別通過下面的匹配輸出就能對比出來了。

    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "\B200\B"
    30120200450122417014080
    7830180020045012241704080
    3018002004501202417040707070
    3893018002004501202410004070
    303018002004501202410004070
    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "\b200\b"
    130 120 200 450 12 24 70 140 8000 30
    30 120 200 450 12 24 170 140 80
    78 30 1800 200 450 12 24 170 40 80
    30 1800 200 450 120 24 170 40 70 70 70
    389 30 1800 200 450 120 24 1000 40 70
    30 30 1800 200 450 120 24 1000 40 70
    130120 200 450122470140800030
    [root@zhuzw-centos6 tmp]# cat ceshi | grep -E "\<200\>"
    130 120 200 450 12 24 70 140 8000 30
    30 120 200 450 12 24 170 140 80
    78 30 1800 200 450 12 24 170 40 80
    30 1800 200 450 120 24 170 40 70 70 70
    389 30 1800 200 450 120 24 1000 40 70
    30 30 1800 200 450 120 24 1000 40 70
    130120 200 450122470140800030

最后呢我們來匹配下一個郵箱地址

郵箱的格式 zhuzw_1203@126.com

這是126的郵箱名字規則:6~18個字符,可使用字母、數字、下劃線,需以字母開頭

grep -E "^[[:alpha:]]([a-z]|[A-Z]|[0-9]|[_]){5,17}@([[:alnum:]]+[\.])+[[:alnum:]]+$"
"[[:alpha:]]([a-z]|[A-Z]|[0-9]|[_]){5,17}@([[:alnum:]]+[\.])+[[:alnum:]]+"

字母開頭[[:alnum:]]

可使用字母、數字、下劃線 :([a-z]|[A-Z]|[0-9]|[_])

6~18個字符:{5,17}注意因為前面已經有開頭的字母占一位了

@:@ 

郵箱后綴格式126.com :  ([[:alnum:]]+[\.])+[[:alnum:]]+

    英文大小寫數字字符至少出現一次,轉義.這個符號;把這兩個字表達式作為一個組至少出現一次;最后匹配一個英文大小寫數字字符至少出現一次。分組的原因是可能會有126.com.cn  126.163.com.cn 這種格式的出現。

    好了寫到這里正則表達式的筆記和分享暫告一段落。最后呢其實還是大家先去分析下我們的最終目標然后結合語法去寫;目標明確才好去實現。

原創文章,作者:東郭先生,如若轉載,請注明出處:http://www.www58058.com/3213

(0)
東郭先生東郭先生
上一篇 2015-04-15
下一篇 2015-04-15

相關推薦

  • Linux程序包管理(一)RPM使用

    Linux程序包管理 在早期我們使用源代碼的方式安裝軟件時,都需要先把源程序代碼編譯成可執行的二進制應用程序,然后進行安裝。意味著每次安裝軟件都需要經過 預處理 –> 編譯 –> 匯編–> 鏈接, 這個復雜的過程。為簡化安裝步驟,程序提供商就在特定的系統上面編譯好相關程序的安裝文件并進行打包,提…

    Linux干貨 2016-06-01
  • 腳本編程之循環:for,while,until

    shell中的循環語句一般有: for   while   until 一、for     for 變量名 in 列表;do         循環體     d…

    Linux干貨 2016-08-18
  • 權限管理

     權限管理:  ls -l       rwxrwxrwx:              左三位:定義user(owner)的權限              中三位:定義g…

    Linux干貨 2016-12-21
  • Linux文件管理初步(第二周)

    第二周作業 1.Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示 目錄管理管理類命令 mkdir make directories mkdir [OPTION]… DIRECTORY… 注意:路徑基名作為命令的作用對象時,基名之前的路徑必須要存在;     -p:自動按…

    Linux干貨 2016-09-05
  • 馬哥linux運維網絡班第22期-第一周博客作業

    計算機的組成及其功能 計算機由運算器,控制器,存儲器,輸入裝置和輸出裝置組成 (1)運算器 對數據進行常規運算(+,-,*,/)和邏輯運算(與,或,非等)及比較位移等操作 (2)控制器 分析從存儲器中讀出的指令并按預先規定的步奏執行操作 (3)存儲器 存儲程序和數據信息并實現快速存取 (4)輸入設備 把各種類型的信息轉換為二進制編碼輸入進計算機存儲起來 (5…

    Linux干貨 2016-08-14
  • php-fpm實驗

    #yum install marisdb-server #vim /etc/my.cnf.d/server.cnf [mysqld]         skip_name_resolve=ON         innodb_file_per_…

    Linux干貨 2017-06-08
欧美性久久久久