1. 正則表達式
1.1 什麼是正則表達式?
我們將正則表達式看作一種由簡單語言實現的程序,這種語言只有一個任務:查找某個字符串,返回“匹配上(it matches)”或者“不匹配(it doesnot match)”。這就是它完成的所有工作。
1.2 使用簡單的模式
$_ =“yabba dabba doo”;
if(/abba/){
print “It matched!/n”;
}
所有在雙引號中的轉義字符在模式中均有效,因此你可以使用/coke/tsprite/來匹配11 個字符的字符串coke, tab(製表符),sprite。
1.2.1.元字符
點(.)是通配符,它可以匹配任何單個的字符,但不包括換行符(“/n”)
如果只希望點(.)匹配句號,可以使用反斜線。這條規則對Perl 正則表達式中所有元字符均有效:元字符前使用反斜線將使它變成普通的字符。如,模式/3/.14159/中的點(.)即不是通配符。
1.2.2.簡單的量詞
星號(*)表示匹配前一項0次或者多次。因此,/fred/t*barney/將匹配上fred 和barney
之間有任意個製表位(tab)的字符串。它可以匹配“fred/tbarney”,其間有一個tab;匹配“fred/t/tbarney”,其間有兩個製表位;“fred/t/t/tbarney”其間有三個製表位;“fredbarney”,其間什麼也沒有。其間可以是任意個製表符,但不能是其它的字符。
因此.*將匹配任意字符任意多數,這就是說模式/fred.*barney/將匹配fred,和barney 之間有任意多個任意字符(不含換行符)的字符串
加(+)也是。加(+)的意思是可以匹配前面一項的一個或多個:/fred +barney/意思是fred 和barney 之間由空格分開,且只能是空格
問號(?),其含義是前面一個項出現一次,或者不出現。也就是說,前面這個項出現1 次或者0 次,此外不會有其它情況。因此,/barm-?bamm/只匹配:bamm-bamm 或bammbamm。
1.2.3.模式中的分組
括號(())用來表示分組,模式/(fred)+/能匹配上像fredfredfred 這樣的字符串,這更可能是你所希望的。那麼模式/(fred)*/呢?它將匹配上像hello,world 這樣的字符串
1.2.4.選擇符
豎線(|),在這種用法中通常被讀作“或(or)”,意思是匹配左邊的或者右邊的。因此,/fred|barney|betty/將匹配出現過fred,或者barney,或者betty 的字符串。
模式/fred (and|or) barney/能匹配如下兩種字符串:fred and barney, fred or barney
1.2.5.字符類
方括號[]中的一列字符,可以匹配上括號內出現的任意單個字符。
例如,字符類[abcwxyz]可以匹配上括號內七個字母中的任意一個。爲了方便,我們可以使用連字號(-)來表示某個範圍的字母,因此上例也可以寫做[a-cw-z]。上面例子省略的字符不多,但像[a-zA-Z]將非常方便,你可以使用和雙引號相同的字符簡寫方法,例如類[/000-/177]可以匹配上任意的七比特的ASCII 字符
$_ = “The HAL-9000 requires authorization to continue.”;
if(/HAL-[0-9]+/){
print “The string mentions some model of HAL computer./n”;
}
[^def]將匹配上這三個字符中之外的任意單個字符。[^n/-z]將匹配上n, -, z 之外的任何字符。
1.2.6.字符類的簡寫
任何數字的類,[0-9],可以被簡寫爲:/d。剛纔那個例子可以被寫作/HAL-/d+/。
/w 被稱作“word’字符:[A-Za-z0-9_]
模式/fred /w+ barney/將匹配fred,空格,一個“單詞(word)”,然後是空格和barney
/s 對於匹配空白(whitespace)將非常方便。它等價於[/f/t/n/r ],其含5 個空白字符:格式符(form-feed);製表符(tab),換行符,回車,以及空格符
1.2.7.簡寫形式的補集
你可以使用[^/d], [^/w], 和[^/s],其含義分別是,非數字的字符,非word(記住我們對word 的定義)的字符,和非空白的字符。也可以使用它們對應的大寫形式:/D, /W, /S 來完成。
另一個類字符[/d/D],它的意思是任何數字,和任何非數字,則意指任何字符。甚至包括換行符,而點(.)匹配除換行符以外的任何字符。
而[^/d/D]則完全沒用,因爲它匹配既非數字也非非數字的字符,那什麼也不是。