1. 正則表達式運算符
i 關閉大小寫敏感性
m 將字符串作為多行處理
o 只編譯模式一次 。 用於優化搜索流程
s 嵌入換行符時 , 將字符串作為單行處理
x 允許在正則表達式中提供注釋 , 並忽略空白字符。
g全局匹配 。 即查找所有具體值 。 如果用於數組型上下文語境 , 則會返回一個列表 ; 如果用於標量型上下文語境 , 則返回真或假。
perl中的正則表達式的強大是公認的,下面我們就來看看他長得什么樣。
最簡單的正則表達式就是/regular expression/,兩個斜杠中間的內容代表了你要匹配的內容,這樣就構成了最簡單的正則表達式,還可以這樣,m/regular expression/,m#regular expression#,m'regular expression'...也就是說,你要將表達式的內容用m和對稱的符號進行包裹,就會構成匹配了。說了這么多我們來看例子吧。
while(<DATA>){ print if /Betty/; } _ _DATA_ _ Steve Blenheim Betty Boop #匹配到Betty Igor Chevsky Norma Cord Jon DeLoach Karen Evich (The Script) while(<DATA>){ print unless /Evich/;#unless = if not,看到unless就把它轉換成if 然后表達式的取反。 } _ _DATA_ _ Steve Blenheim Betty Boop Igor Chevsky Norma Cord Jon DeLoach Karen Evich # Print line unless it matches Evich #(輸出) #Steve Blenheim #Betty Boop #Igor Chevsky #Norma Cord #Jon DeLoach while(<DATA>){ print if m#Jon# # Print the line if it matches Jon } _ _DATA_ _ Steve Blenheim Betty Boop Igor Chevsky Norma Cord Jon DeLoach Karen Evich #(Output) #Jon DeLoach $_ = "I lost my gloves in the clover, Love."; @list=/love/g; #匹配到了gloves和clover中的love,然后將他們以數組的形式返回。Love沒有匹配到是因為沒有打開i這個忽略大小寫的開關。下面的例子中會看到。 print "@list.\n"; #(Output) #love love. $_ = "I lost my gloves in the clover, Love."; @list=/love/gi; print "@list.\n"; #(Output) #love love Love. 輸出結果的原因請參考上面的例子。 ################################# #特殊標量 $& 中保存着上一次成功的搜索過程中所匹配的字符串值 。 &`(ESC下面的那個鍵)保存了成功匹配模式之前所找到的內容 。 &' 則負責保存成功匹配模式之后找到的內容 。 $_="San Francisco to Hong Kong\n"; 2 /Francisco/; print $&,"\n"; 4 /to/; print $`,"\n"; # Save what comes before the string 'to' 小技巧:只要記住`往前傾斜,所以是之前的。剩下的就是匹配到的之后的 /to\s/; print $', "\n"; # \s represents a space # Save what comes after the string 'to' # Save 'Francisco' in $& if it is found #(Output) #Francisco #San Francisco #Hong Kong ############################### #s 運算符與替換 ############################### while(<DATA>){ s/Norma/Jane/; #最簡單的替換,找到Norma,然后替換成Jane。 print; } _ _DATA_ _ Steve Blenheim Betty Boop Igor Chevsky Norma Cord Jon DeLoach Karen Evich # Substitute Norma with Jane #(Output) #Steve Blenheim #Betty Boop #Igor Chevsky #Jane Cord #Jon DeLoach #Karen Evich while(<DATA>){ print if s/Tom/Christian/g; #全局匹配並替換。 } _ _DATA_ _ # All occurrences of Tom on each # line are replaced with Christian171 #正則表達式 —— 模式匹配 Tom Dave Dan Tom Betty Tom Henry Tom Igor Norma Tom Tom #(Output) #Christian Dave Dan Christian #Betty Christian Dick Christian #Igor Norma Christian Christian while(<DATA>){ print if s/igor/Daniel/i; #i忽略大小寫。 # Substitute igor with Daniel } _ _DATA_ _ Steve Blenheim Betty Boop Igor Chevsky Norma Cord Jon DeLoach Karen Evich #(Output) Daniel Chevsky while(<DATA>){ s/6/6 * 7.3/eg; # 找到匹配6然后求值並全局替換。 print; } _ _DATA_ _ Steve Blenheim 5 Betty Boop 4 Igor Chevsky 6 Norma Cord 1 Jon DeLoach 3 Karen Evich 66 #(Output) #Steve Blenheim 5 #Betty Boop 4 #Igor Chevsky 43.8 #Norma Cord 1 #Jon DeLoach 3 #Karen Evich 43.543.8 ################################### #模式匹配的含義 ################################### 示例 涵義 $name =~/John/ 如果 $name 含有模式則為真 。 如果是真 , 返回 1 ; 否則返回空值 $name !~/John/ 如果 $name 不含有模式 , 則為真 $name =~s/John/Sam/ 將匹配 John 的第一個值替換為 Sam $name =~s/John/Sam/g 將匹配 John 的所有具體值替換為 Sam $name =~tr/a-z/A-Z/ 將所有小寫字符翻譯為大寫字母 $name =~/$pal/ 在搜索字符串時使用變量