Perl正則表達式之模式匹配


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/         在搜索字符串時使用變量

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM