正則表達式概念詳解


正則表達式就是使用一些抽象出來用來代表某類字符的特定字符組成的字符串。
正則表達式是用來在大量字符中匹配(尋找)符合自身字符規則的字符串。
 
正則表達式是一種規則(人為定義的用某些字符表示一類字符的規則)。
下面主要說明定義正則表達式規則所抽象出來的所有字符所包含的意義。
 
 
1. 元字符
            
 
    .      匹配除了換行符以外的任意字符                            
                  ....    -->   asdf
    \w   匹配字母、數字、下划線、漢字                              
                \w\w\w\w    -->    a3_我      
    \s    匹配任意空白符(空格,換行,制表符)                 
    \d    匹配所有數字                                                         
                \d\d\d\d    -->    1234
    \b    匹配單詞的開始或結束                                            
                \bhi\b  在文本asdfawef hi asdfwz中會匹配hi,在文本dsfgsdfgsdfghidsfgsdfgsd不會匹配其中的hi單詞,即\b要匹配一個單詞的起始位置,起始位置必須是各種空白符,但是\b單獨不匹配空白符,有單詞才匹配空白符。如果使用\b\b測試,不會匹配任何字符。
    ^     匹配字符串的開始                                               
               ^用來查看字符串的開始位置是否有符合目標的,^hi 在文本hisdafsdfawsef中可以匹配hi,但是在文本sadfasdfhiasdfsad、 hiasdfasdfasdf(第一個是空格)中都不會匹配任何字符,如果是在多行模式下,換行符相當於字符串的結束位置。
    $      匹配字符串的結束           
                $用來查看字符串的末尾是否有符合標准的, $hi 在文本asdfasefashi中匹配hi,但在文本asdfawefasdhiasdfas、fasdfasdffasdahi (最后一個是空格)不會匹配任何字符,如果是在多行模式下,換行符相當於字符串的結束位置。               
 
2. 字符轉義
    正則表達式規則定義了一些具有意義的字符,如果想使用正則表達式匹配這些特定字符就需要使用轉義的方式,就是在 這些字符的前面加上一個反斜杠。
    \* 匹配 *,  \. 匹配 ., 如果要匹配\,也要使用轉義 \\ 。
 
3. 重復
            
 
    *      重復0次或多次
        .*  代表任意字符重復0次或者多次,可以匹配  dsfasdfadasd、fase、(什么也沒有)。
    +     重復1次或多次
        .+ 代表任意字符重復1次或者多次,可以匹配  dsfasdfadasd、fase。
    ?    重復0次或1次
        .?  代表任意字符重復0次或者1次,可以匹配  a、1、_、(什么也沒有)。
    {n}    重復n次
        .{5}   代表任意字符重復5次,可以匹配  asdfa、s des、122 4、     (五個空格)。
    {n,}   重復n次或n次以上,注意括號中逗號后面是沒有空格的
        .{5,}    代表任意字符重復5次或者5次以上,可以匹配  fassd、fsdafsdfasdf、fasdfasdf sdf2we      。
    {n,m}  重復n到m次。
        .{5,10}   代表任意字符重復5到10次,包含10次,可以匹配  dasfasdf、sddwe、xzczcwesdv。
 
4. 字符集
    使用中括號 [] 把一些字符括起來組成一個字符集。
    [aeiou]  匹配   sdfwaefdaxdfawefiousdfiuo。
    [+*-?!$^.]   這些符號都可以匹配到並且不用轉義, 在字符集中只有 \ 需要使用轉義,其他字符都不需要。     fa.sdfas+-asdf*asdfgsa$sd^asdfgs?sdgfa
    [1-9]  - 號還可以當做表示一個范圍的符號(只有在字符集中且前面的字符編碼比后面的字符編碼小才可以,前大后小會出錯)。 23678532813zxd23wedfas   不匹配0
    [\\]  轉義之后才可以匹配 \                 asdefasdasfedf\asdfaw\asdfx\sd    
    由以上的例子可以看出,字符集就是用來查找某一個位置的字符是否符合字符集中的某個字符。
            注: 字符集中 ^ 這個符號在第一位和其他位置的意義不同,在其他位置才代表匹配^號,在第一位的情況會在 第6 節反義 里面說明。
 
5. 分支
    使用  |  符號可以實現  或  的意義。
    \d{5}-\d{4}|\d{5}   匹配  5位數字-4位數字 或者 5位數字 -->  11111-1111 或者 11111  
    \d{5}|\d{5}-\d{4}   匹配  5位數字 或者 5位數字-4位數字 -->  11111 或者 11111-1111
    但是要注意的是,第二個表達式不會匹配到或后面的形式,因為正則表達式的或語句在查找的時候是從左到右進行對比的,如果前面的匹配就不會在查看后面的了。也就是說,使用第二個表達式,如果有11111-1111的形式,由於前面5個1已經符合了或前面的形式,故只會查找出來前五位組成11111。 勞務派遣
 
 
6. 反義
                
 
   \W    匹配除字母、數字、下划線、漢字以外的字符
    \S       匹配除了空白符意外的字符
    \D      匹配除了數字意外的字符
    \B       匹配不是單詞開頭和結束的位置 
        以上4個使用符號沒什么大的變化就不舉例說明了。
    [^x]    匹配除了x之外的任意字符
    [^wasd]    匹配除了wasd之外的任意字符
        使用字符集定義反義的這種方式一定要注意的是  ^這個符號必須在字符集的第一位,且該符號后面有一個任意符號才可以生效,匹配除了^后面所有的符號之外的符號。
    例如:
        [^asdfawef++!!@_]  這種就是除了asdfawef++!!@_之外的任意符號
        [sdfasdf^awef]  而這種只是一個字符集而已
 
7. 分組
    通過 第三節重復 我們已經掌握了對單個字符重復的方法,但是如何對多個字符進行重復呢?
    使用 () 小括號將需要整體重復的部分括起來之后使用 之前說的重復方法進行重復的設置即可。
    (\d{5}-\d{4}|\d{5}){2}   這個式子將 11111-1111或者11111 這種形式重復了兩次   12345-678912345-678912312,1231234121234。
 
                
    每次使用一對 () 小括號,就是分了一個組,這個組的內容就是括號里面的正則表達式,並且要注意的是每個組都有一個組號(編號),這個組號是自動分配的,分配原則是:
    1. 從左到右分配組號,第一個組是1,依次類推。(正則表達式整體是一個組,組號是0)
    2. 實際上會從左到右查找兩次,第一次給未命名的組分配組號,第二次給已命名的組分配組號。
    3. 可以使用(?:xxx)的語法來讓一個組不參與自動分配組號。
    下面的后向引用、零寬斷言、負向零寬斷言、注釋都是對 () 的使用技巧。也就是分組的使用技巧。
8. 后向引用
   后向引用是指通過  反斜杠\ 加上 數字(組號)的方式來重復使用某一組的正則表達式。
    例如:  (\d+)\s{1}\1   這個式子中可看出 \d+ 是第1組,組號就是1,后面的\1就是引用了前面這一組的內容,相當於 (\d+)\s{1}(\d+)。用於匹配一些數字中
間有一個空白符之后又是一些數字的形式。
                \b(\w+)\b\s+\1\b   同樣這個式子中  \w+ 是第一組,組號是1,后面使用了\1的方式引用了前面的內容。用於匹配 go go 、hello hello 這種形式。
     還有一種情況是某一組如果通過(?<name>exp)這樣的語法設置了一個名字,可以通過上面說的方法引用,還可以使用 \k<name> 這樣的方法引用該表達式。例如:\b(\w+)\b\s+\1\b  也可以寫成  \b(?<Word>\w+)\b\s+\k<Word>\b
     最后,我們還可以使用(?:exp)這樣的語法使一個組得不到組號。
     注: 要使用 后向引用 一定要對要引用的那個組的組號很清楚。
 
9. 零寬斷言
    零寬斷言有兩種: 
        1. 零寬度正預測先行斷言 (?=exp)
                這個語法能斷言自身出現的位置的后面能匹配到exp表達式,最后輸出結果不包括exp匹配的字符
                例如: \b\w+(?=ing\b)  這個式子用來匹配 以ing結尾的單詞,但不包含ing dsfasfaasd wsding sadfa aoweing asdaing 
        2. 零寬度正回顧后發斷言 (?<=exp)
            這個語法能斷言自身出現的位置的前面能匹配到exp表達式,同樣最后輸出的結果不包含exp匹配的字符  
               例如: (?<=\bre)\w+\b  這個式子用來匹配 以 re 開頭的單詞,但不包含re      sfafalinn resadfasil klkjresafdssj
 
10. 負向零寬斷言
    負向零寬斷言也有兩種: 
        1. 零寬度負預測先行斷言 (?!exp)
                這個語法能斷言自身出現的位置后面不能匹配exp表達式
                例如:\d{3}(?!\d)  匹配三位數字,並且這三位數字后面不能是數字    hkhkh123hkkbjkb4353jkhh213
        2. 零寬度負回顧后發斷言 (?<!exp)
                這個語法能斷言自身出現的位置前面不能匹配exp表達式
                例如:(?<![a-z])\d{7} 匹配前面不是小寫字母的七位數字 asdkfhlkh123123412hkhASEDAK131241231
        舉例:(?<=<(\w+)>).*(?=<\/\1>)   能匹配兩個標簽之間的內容   <b>asdfaweasdfasdfs</b>
 
11. 注釋
    使用(?#comment)這種語法可以給表達式添加注釋,是閱讀變得容易一點。
        例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
    還有一種使用注釋的方法,就是啟用“忽略空白”模式,在此模式下所有空白被忽略,並且啟動使用#的注釋方法。此模式下#后面的到這一行結束的所有文本都會被當做注釋:
      (?<=    # 斷言要匹配的文本的前綴
      <(\w+)> # 查找尖括號括起來的字母或數字(即HTML/XML標簽)
      )       # 前綴結束
      .*      # 匹配任意文本
      (?=     # 斷言要匹配的文本的后綴
      <\/\1>  # 查找尖括號括起來的內容:前面是一個"/",后面是先前捕獲的標簽
      )       # 后綴結束
 
12. 貪婪與懶惰
    在匹配時你會發現如果不加以限制,正則表達式會去匹配符合當前要求的最長的字符串,例如a.*b這樣的表達式,在匹配aaabab時會匹配整個字符串(aaabab),這樣的匹配方式成為貪婪匹配;還有一種匹配方式,就是在符合要求的前提下盡可能短的匹配,只要給表達式合適的位置加一個?就行,這種匹配方式稱為懶惰匹配。例如使用懶惰匹配去匹配aaabab時會得到aaab、ab兩個子串。
                    
    參照表中的寫法即可。·
 
13. 處理選項
    正則表達式有以下幾種不同的模式。
      
 
14. 平衡組/遞歸匹配
        如何匹配<ASdfas<Asdfasdf<asdfa<adga>>>>這樣多個括號嵌套的字符串?
        正則表達式提供三種語法組合使用來匹配這樣的字符串。
            (?'group')    把捕獲的內容命名為group,並壓入堆棧
            (?'-group')    彈棧操作,彈出命名為group的捕獲內容
            (?(group)yes|no)    判斷堆棧,如果有group執行yes,沒有匹配no
        舉例說明:要匹配        <ASdfas<Asdfasdf<asdfa<adga>>>>>>>>
                使用的表達式為(((?'open'<)[^<>]*)+((?'-open'>)[^<>]*)+)*(?(open)(?!))
        注: 這個表達式最后一個組里使用的(?!)是零寬度負預測先行斷言,由於后面沒有表達式,所以匹配一定會失敗,即當group還有,也就是匹配yes的時候就匹配失敗。
 
15. 其他
    

                                                   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM