PERL學習筆記---正規表示式

wangyy發表於2014-06-11

要匹配某個模式(正規表示式)和$_的關係,可以將模式放在正斜線(//)之間,如下:
$_ =“yabba dabba doo”;
if(/abba/){
print “It matched!\n”;
}

表示式/abba/將在$_尋找這四個字母。如果找到,則返回true,在本例中,它出現了不止一次,但結果沒什麼不同。總之,
如果找到了,則匹配上;如果沒找到,則沒匹配上。
由於模式匹配通常返回true 或false,因此經常用在if 或while 的條件表示式部分。
所有在雙引號中的轉義字元在模式中均有效,因此你可以使用/coke\tsprite/來匹配11 個字元的字串coke, tab(製表符),
sprite。

 

,點(.)是萬用字元,它可以匹配任何單個的字元,但不包括換行符(“\n”)。點(.)只匹配一個字元。、

反斜線是第二個元字元。如果需要真正的反斜線,需要重複使用兩個反斜線。

。星號(*)表示匹配前一項0次或者多次。因此,/fred\t*barney/將匹配上fred 和barney
之間有任意個製表位(tab)的字串。

如果希望包括不同的字元,怎麼辦呢?點(.)可以匹配任何單字元◆,因此.*將匹配任意字元任意多數。這就是說模式
/fred.*barney/將匹配fred,和barney 之間有任意多個任意字元(不含換行符)的字串。任意行如果前面有fred,後面有barney,
其間為任意字元(字串)都將匹配上。我們將.*叫做“任意字串匹配模式”,因為任意的字串均能被匹配上(不包括
換行符)。

星號的正是叫法是數量詞(quantifier),意指其可以指代多個前面的項。它不是唯一的數量詞,,加(+)也是。加(+)的意思是可
以匹配前面一項的一個或多個:/fred +barney/意思是fred 和barney 之間由空格分開,且只能是空格。(空格不是元字元)。
它不會匹配fredbarney,因為加(+)意指一個或多個,因此至少是一個。可以這樣看待加(+):“最後一項,(可選的)至少還
有一項。”

還有第三個數量詞,其限制性更強。它是問號(?),其含義是前面一個項出現一次,或者不出現。也就是說,前面這個項出
現1 次或者0 次,此外不會有其它情況。因此,/barm-?bamm/只匹配:bamm-bamm 或bammbamm。這很容易記住:“前面
的這個項,出現?或者不出現?”

 

模式中的分組:括號也是元字元。在數學中,括號(())用來表示分組

選擇符: 豎線(|),在這種用法中通常被讀作“或(or)”,意思是匹配左邊的或者右邊的。如果豎線左邊沒有匹配上,則匹配右邊。因
此,/fred|barney|betty/將匹配出現過fred,或者barney,或者betty 的字串

/fred( |\t)+barney/這樣的模式,它將匹配fred,barney 以及中間由空格,製表符(tab),或者二者混合所組
成的字串

 

字元類的簡寫

有一些字元類出現的非常頻繁,因此提供了其簡寫形式。例如,任何數字的類,[0-9],可以被簡寫為:\d。因此,HAL 這

個例子可以被寫作/HAL-\d+/。
\w 被稱作“word’字元:[A-Za-z0-9_]。如果你的“words”由通常的字母,數字,下劃線組成,那你將非常喜歡它。通常認
為“word”由字母,連線符(-),撇號(')◆組成,我們希望能改變這種定義◆。因此使用它,請記住我們對“word”的定義,
字母,數字,下劃線組成。
◆至少,在英語中是這樣。在其它語言中,其words 由不同的符號組成。檢視perllocale 的幫助手冊瞭解更多的資訊。
◆當檢視ASCII 編碼的英語文字時,我們遇到單引號和撇號(')是相同字元的問題,因此很難說cat’是cat 和一個撇號( '),還是cat 後接單引
號。這可能是計算機還不能接管世界的一個原因。
當然,\w 不能匹配單詞,而只能匹配單個字元。為了匹配整個單詞,需要後接加號。模式/fred \w+ barney/將匹配fred,空
格,一個“單詞(word)”,然後是空格和barney。因此,如果fred 和barney 之間有一個單詞◆,由單個空格分隔開,它將
能匹配上。
◆我們將停止在word 上加引號;現在你已經知道其是由字母-數字-下劃線組成的。
你可能已經注意到在前一例中,如果能更加靈活的匹配空白將很方便。\s 對於匹配空白(whitespace)將非常方便。它等價

於[\f\t\n\r ],其含5 個空白字元:格式符(form-feed);製表符(tab),換行符,回車,以及空格符。同其它簡寫符號一樣,
\s 匹配此類中的單個字元,如果使用\s*將匹配任何個數的空白(包括沒有),或者\s+匹配一個以上的空白(事實上,很少
見到單獨使用\s,而不使用任何的數量詞(*, +))。由於這些空白符看起來類似,因此可以使用這種簡寫形式,將它們統一處
理。
 簡寫形式的補集
某些時候,你可能希望得到這三種簡寫形式的補集。如果那樣的話,你可以使用[^\d], [^\w], 和[^\s],其含義分別是,非數
字的字元,非word(記住我們對word 的定義)的字元,和非空白的字元。也可以使用它們對應的大寫形式:\D, \W, \S 來
完成。它們將匹配它們對應的小寫形式不能匹配上的字元。
這些簡寫形式可以在字元類中使用,或者在大的字元類中的中括號裡面使用。也就是說你可以使用/[\dA-Fa-f]+/來匹配十六
進位制(底為16)的數字,它將ABCDEF(或者其小寫形式)作為附加的數字(11 到15)。
另一個類字元[\d\D],它的意思是任何數字,和任何非數字,則意指任何字元。這是匹配所有字元的一種通用方法,甚至包
括換行符,而點(.)匹配除換行符以外的任何字元。而[^\d\D]則完全沒用,因為它匹配既非數字也非非數字的字元,那什麼
也不是

 

如果喜歡作者的文章,請關注"寫程式碼的猿"訂閱號以便第一時間獲得最新內容。本文版權歸作者所有,歡迎轉載. 

相關文章