一、正則表達式的語法
要靈活運用正則表達式,必須瞭解其中各種元字符的功能,元字符從功能上大致分爲:
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}$/