我學習正則表達式的筆記

一、正則表達式的語法
要靈活運用正則表達式,必須瞭解其中各種元字符的功能,元字符從功能上大致分爲:
  1,限定符
 2,選擇匹配符
 3,分組組合和反向引用符
 4,特殊字符
 5,字符匹配符
 6,定位符

限定符:用於指定前面的字符或組合項連續出現多少次。
1,{n}
舉例說明:“o{2}”不能與“Bob”中的“o”匹配,但可以與“food”中的兩
個“o”匹配,也可與“fooood”中的任意兩個連續的“o”匹配。
2,{n,}
舉例說明:“o{2,}”不能與“Bob”中的“o”匹配,但可以與“foooood”中的所有
的“o”匹配。
3,{n,m}
舉例說明:“o{1,3}”既可匹配“food”中的兩個“o”,又可匹配“fooood”中的
連續的三個“o”。
4,+ (前面的元素或組合項至少出現一次)
舉例說明:“zo+”與“zo”和“zoo”等在字母之z後面連續出現一個或多個字母
O的字符串匹配。(等效如{1,})
5, *(前面的元素或組合項至少出現0次或多次)
舉例說明:zo*與“z”和“zoo”都能匹配。*等效於{0,}。
6,?(規定前面的元素或組合項出現0次或1次)
舉例說明:“zo?”可以匹配“z”或“zo”,也可以匹配“zoo”中的“zo”部分
,但不能匹配整個“zoo”。(等效於(0,1))


貪婪匹配與非貪婪匹配
1. 貪婪匹配
默認情況下,正則表達式使用最長(也叫貪婪)匹配原則。例如,要將
“zoom”中匹配“zo?”的部分替換成“r”,替換後的結果是“rom”
不是“room”;如果要將“zoom”中匹配“zo”部分替換成“r”,替換後的結果
是“rm”,不是“rom”或“room”。
2. 非貪婪匹配
當字符“?”緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之後時,
匹配模式變成使用最短(也叫非貪婪)匹配原則。例如,在字符串“fooood”
中,“fo+?”只匹配“fo”部分,而“fo+”匹配“foooo”部分。


選擇匹配符:
選擇匹配符只有一人,就是“|”字符,用於選擇匹配兩個選項之中的任意一個,
它的兩個選項是“|”字符兩邊的儘可能最大的表達式。
     舉例說明:
         “chapter|section 1”匹配的是“chapter”或“section 1”,而不是
          “chapter 1”或“section 1”;如果要匹配“chapter 1”或“section 1”,
           應該使用括號創建子表達式,即“(chapter|section)1”。

 

分組組合和反向引用符:
    分組組合符:將正則表達式中的某一部分內容組合起來的符號。
    反向引用符:用於匹配前面的分組組合所捕獲到的內容的標識符號。

   
• (pattern)(存入緩衝區)
     說明:若要匹配字面意義的括號字符“(”和“)”,在正則表達式中要分別
     使用“/(”和“/)”。
•  /num
     舉例說明:要匹配連續的5個數字字符,可以使用/d{5}作爲是正則表達式文本
     但是,要匹配連續的的5個相同的數字字符,需要使用(/d)/1{4}作爲正則表達式文本。要匹配“Is is the cost of of gasoline going up up?”中所有連續重複的單詞部分,可以使用//b([a-z]+)/1/b/gi作爲正則表達式文本。
•  (?:patterm)(不存入緩衝區)
     舉例說明:不能將“industry|industries”簡單地改寫成“industr(y|ies)”,
     如果不需要引用或檢索括號中的表達式所匹配的結果,最好還是改寫成“industr(?:y|ies)”。
•   (?=pattern) 
      正向“預測先行”匹配
      舉例說明:使用“Windows(?=NT|2000)”作爲正則表達式模式,它只與“Windows 2000”或“Windows NT”中的“Windows”匹配,而不與“Windows 2003”中的“Windows”匹配。
       ?多想一想:以“Windows(?=NT|2000)Series”作爲正則表達式模式,在文本“My Windows NT Series”中的匹配結果是多少呢?

•   (?!pattern)
      反向“預測先行”匹配
      舉例說明:使用“Windows(?!NT|2000)”作爲正則表達式,它不與“Windows 2000”或“Windows NT”中的“Windows”匹配,而可以與“Windows 2003”中的“Windows”匹配。


特殊字符
       正則表達式中以反斜槓字符(/)後緊跟其它轉義字符序列來表示非打印
       字符和原義字符。
    
     •   /xn
            ASCⅡ碼值等於n的字符,這裏的 n必須是兩位的十六進制數
舉例說明:“/x41”匹配字符“A”。注意:“/x041”所表示的字符
            後跟字符“1”。
      •     /n
             要求這裏的n(0-7)是一個一位的八進制數,如果這裏的n前面至少
             有n個捕獲子匹配,那麼這個斜槓n它就是被用作反向引用,否則它就是被
             用作匹配ASCII碼值等於這個n的字符
      •     /nm
              這裏的m和n都是一位的八進制數如果在這個表達式的前面至少有nm個捕獲子表達式,那麼這個格式就是反向引用,如果前面至少有n個捕獲,那麼這個表達式的/n部分就是反向引用,那麼後面m就是字面意義上的數字字符了,如果剛纔說的那些條件都不存在,那麼它纔是匹配ASCII碼的值的八進制形式等於nm的那個字符
      •     /nml
              當n是0到3之間的八進制數和m和l是0到7之間的八進制數的時候,它才能匹配ASCII碼值的八進制形式等於nml的那個字符。
      •     /un
              用來匹配Unicode碼等於n的字符,這裏的n必須是一個四位的十六進制數據
              舉例說明:/u00A9匹配版權符號。
      •     /CX
              匹配由X所指定的控制字符。這個X的值必須是大寫的A到Z或
              小寫的a到z之間的一個字符,否則這個C完全是字面意義上的字符
               C本身,X是原來的字符意義了,而不再表示控制字符了
              舉例說明:/cM匹配Control+M表示的控制字符,也就是回車符。
      •     /f 
              匹配換頁符,等效於/x0c和/cL。
      •     /n
              匹配換行符,等效於/x0a和/cJ。
      •     /r
              匹配回車符,等效於/x0d和/cM。
      •     /t
              匹配製表符,等效於/x09和/cl。
      •     /v
              匹配垂直製表符,等效於/x0b和/cK。

字符匹配符
字符匹配符:用於指定該符號部分可以匹配多個字符中的任意一個。
• […]
說明:如果字符集中要包含“]”字符,需要將它放在第一位,即緊跟在開始“[”後面。[…]中的字符“/”仍然作爲轉義符,若要在[…]中包含“/”本身,需要使用“//”。
•  [^…]
     說明:只要字符“^”不是出現在第一個“[”後面,它就是還是字面意義上的“^”。
•   [a-z]
     說明:要在中括號表達式中包括字面意義的連字符(-),可以用反斜槓(/)將它
     標記爲原義字符,例如,[a/-z],但此時指的是三個字符了。也可以將連字符(-)放在方括號的開始或結尾處,例如,[-a-z]或[a-z-]。
•   [^a-z]
•    /d
      可以匹配任意一個數字字符。
•    /D
      它可以匹配一個非數字字符。
•    /s   等效於[ /f/n/r/t/v]。
      它可以匹配任何空白字符。
•    /S   等效於[^/f/n/rt/v]。
      它可以匹配任何非空白的字符。
•    /w   等效於[A-Za-z0-9_]。
      它可以匹配任何英文字母和數字類的字符以及下劃線。
•    /W   等效於[^A-Za-z0-9_]。
•    .
      它可以匹配除了/n以外的單個任何字符。
      說明:“(.)/1”匹配除了“/n”以外的兩個連續的相同的字符。若要匹配
      包括“/n”在內的任意字符,可以使用“[/s/S]”,“[/d/D]”或“[/w/W]”
      等模式。若要匹配“.”字符本身,需要使用“/.”。
     

定位符 
定位符:用於規定匹配模式在目標字符串中的出現位置。
•   ^
     用於匹配目標字符串的開始位置,規定匹配必須發生在目標字符
     串的開始位置上。
     舉例說明:“^o”與“ok”中的“o”匹配,但與“hello”中的
     “o”不匹配。如果設置了RegExp對象實例的Multiline屬性,
     ^還會與行首匹配,即與“/n”或“/r”之後的位置匹配。
•   $
     用於匹配目標字符串的結尾位置,規定匹配必須發生在目標
     字符串的結尾。這個$ 只能寫在表達式的末尾才能發生此作用。
     舉例說明:“o$”與“hello”中的“o”匹配,但與“ok”中的
     “o”不匹配。如果設置了RegExp對象實例的Multline屬性,
      $還會與行尾匹配,即與“/n”或“/r”之前的位置匹配。
  •  /b
       它可以匹配一個字邊界,也就是一個單詞的邊界。
       它包含了字與空格間的位置以及目標字符串的開始和結束等位置。
       舉例說明:“er/b”匹配“never ok”中的“er”,但不匹配“verb”
       中的“er”。
  •  /B
        用來匹配非字邊界的情況。
舉例說明:“er/B”匹配“verb”中的“er”,但不匹配“never”中的“er”。

原義字符
     在正則表達式中用到的一些元字符不再表示它原來的字面意義,如果要匹配這些具有特殊意義的元字符的字面意義,必須使用反斜扛(/)將它們轉義爲原義字符,即將反斜槓字符(/)放在它們前面。

      需要進行轉義的字符:
      “$”、“(”,“)”、“*”、“+”、“.”、“[”、“]”、“?”、“/”、“/”、“^”、“{”、“}”、“|”


優先級順序
     正則表達式從左到右進行計算,並遵循優先級順序。例如,“*”比字符的優先級高,“ab*”是“b”和“*”組合後、再和前面的“a”組合。“()”比“*”的優先級高,“(ab)*”是“a”和“b”組合後、再和後面“*”組合。字符比“|”的優先級高,“a|bc”是“b”和“c”組合後,再和前面的“a”進行選擇組合,是“a”和“b”進行選擇組合,再和後面的“c”組合。

 

一些正則表達式範例:
   •   匹配空行: /^/s*$/
   •   匹配HTML標記: /<(/S+)(/s[^>]*)?>[/s/S]*<///1/s*>/
   •   匹配email地址: /[a-zA-Z0-9_-]+@[ a-zA-Z0-9_-]+(/.[ a-zA-Z0-9_-]+)+/
   •   匹配兩個相同的相鄰單詞: //b([a-z]+/1/b)/
   •   匹配ip地址:/^(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])(/.(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])){3}$/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章