溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

?如何在Perl中使用正則表達式

發(fā)布時間:2021-12-06 14:07:50 來源:億速云 閱讀:305 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要為大家展示了“如何在Perl中使用正則表達式”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“如何在Perl中使用正則表達式”這篇文章吧。

如何在Perl  中使用正則表達式。

⑴匹配模式

我們已知在Perl中正則表達式被稱為模式,這種模式(也即正則表達式)可以放在由成對符號(例如()、<>{}等)或者一對不成對的符號(例如//、!!^^等)組成的界定符內(nèi),并在界定符前用小寫字母指定模式的種類。當然我們不希望界定符和正則表達式的符號有所沖突(如果實在有沖突可以使用反斜杠轉(zhuǎn)義),事實上最常用的界定符為雙斜杠//。在Perl中有很多處理模式,其中最簡單的為匹配模式m//,或者也可以理解為查找模式。由于正則表達式本身就有匹配的含義,以雙斜杠作為定界符時m可以省略。其他處理模式詳見下一小節(jié)。

關(guān)于  Perl  正則匹配一個簡單的例子如下所示:
$_ = "yabba dabba doo";if (/y(.)(.)\2\1/) {  print "It matched!\n";}

運行結(jié)果如下所示:

?如何在Perl中使用正則表達式

在  if  的圓括號內(nèi)默認匹配的是變量  $_  的內(nèi)容,因此這段程序?qū)嶋H上是下面所示:
$_ = "yabba dabba doo";if ($_ =~ /y(.)(.)\2\1/) {  print "It matched!\n";}

其中=~是表示內(nèi)容匹配的綁定操作符,其返回值為表示是否成功匹配的布爾值,基于上面的寫法我們可以根據(jù)實際需要隨意改變要匹配的變量名稱。

⑵模式修飾符

除了在界定符前可以指定處理模式,在界定符之后還可以添加小寫字母修飾符。這些修飾符也叫標志(  flag  ),用來改變默認的匹配行為,正如上一小節(jié)展示的使用  ASCII  編碼的  //a  一樣。常用的匹配模式下的修飾符有以下幾種:

?如何在Perl中使用正則表達式

上面表格中不同的模式修飾符可以進行組合使用,而且其順序?qū)δJ經(jīng)]有影響,如下所示:
/abc.*xyz/is      #忽略大小寫并使點號匹配任意字符

⑶錨位

從  Perl 5  開始,脫字符  ^  和  $  表示行首和行尾的錨位,這對行輸入的數(shù)據(jù)非常有用,因為行輸入的字符串有且只有一個換行符在末尾。對于具有多個換行符的字符串,也即多行文本數(shù)據(jù)變量,可以使用  //m  修飾符,使得脫字符  ^  和  $  可以同時錨定字符串開頭、每一行開頭、字符串結(jié)尾、每一行結(jié)尾,如下所示:
$_ = "This is the wilma linebarney is on another linebut this ends in fred";if (/^barney/m) {  print "It matched!\n";}
上面代碼中如果不加  //m  修飾符則  ^  只會匹配字符串開頭從而匹配失敗。此外還有另一種更嚴謹?shù)腻^位方法,使用  \A  、  \Z  、  \z  錨定字符串的開頭、每一行末尾、字符串結(jié)尾。需要注意的是對于行輸入的單行字符串來說  \Z  、  \z  也是完全不同的,  \Z  會匹配換行符前的內(nèi)容,而  \z  匹配字符串結(jié)尾(包括換行符)內(nèi)容。其使用方法如下所示:
/\Abarney/    #匹配字符串絕對開頭位置的barney/fred\z/      #匹配字符串絕對末尾位置的fred/fred\Z/      #匹配行尾也即換行符前的fred/\A\s*\Z/    #匹配一個空行
除了字符串、行的首尾,一個單詞的首尾可以使用  \b  進行錨位,這里的單詞指的是  \w  字符集也即  [a-zA-Z0-9_]  組成的字符串,  \b  根據(jù)出現(xiàn)的非  \w  字符(包括字符串的絕對首尾位置)判斷單詞的邊界,如下所示:
/\bfred\b/    #會匹配fred、fred's但是不會匹配afred、fred_s

此外\B則會錨定非單詞邊界,如下所示

/\bfred\B/    #會匹配fred_s 但是不會匹配fred、fred's、afred

⑷變量內(nèi)插

與雙引號內(nèi)部的變量內(nèi)插一樣,正則表達式內(nèi)部也可以使用各種數(shù)據(jù)變量,從而更好的融合到  Perl  程序之內(nèi)。正則表達式一般將變量放在括號內(nèi)(這是和反向引用類似的),例如下面一段類似于  grep  工具命令的小程序:
my $what = <STDIN>;chomp $what;while (<>) {   if (/\A($what)/) {      print "$_";   }}
上面程序中通過鍵盤輸入  $what  的值,正則表達式會根據(jù)  $what  的值對命令行參數(shù)指定的文件的每一行開頭進行匹配,匹配成功則輸出該行內(nèi)容。  $what  可以是任何值,甚至是正則表達式元字符,如下所示:

?如何在Perl中使用正則表達式

⑸捕獲變量

在上一小節(jié)正則表達式的模式分組中,我們知道圓括號通常會觸發(fā)正則表達式捕獲相匹配的字符串以供反向引用。事實上,  Perl  會自動將這些圓括號內(nèi)的捕獲組儲存在稱為捕獲變量的標量變量里面,其變量名與反向引用的編號一樣都是數(shù)字,其命名與捕獲組編號相同,也即  $1  、  $2…  。模式當中有多少圓括號,就有多少捕獲變量,這些變量在正則表達式匹配完成之后仍可以使用,捕獲變量是  Perl  正則表達式強大的原因之一。一個簡單的示例如下所示:
$_ = "Hello there, neighbor";if (/(\S+).*,\s(\w+)/) {   print "What I said is:\n$1 $2!\n";}
運行結(jié)果如下所示:

?如何在Perl中使用正則表達式

這些捕獲變量在下一次正則表達式成功匹配之前都是有效的,如果某次匹配失敗,那么捕獲變量里儲存的仍是上一次成功匹配時的數(shù)據(jù),這里的匹配成功指的是整個模式的匹配而非捕獲組的匹配,這也是模式匹配以及捕獲變量的使用一般在if和while等布爾值控制結(jié)構(gòu)里面的原因。如果想永遠使用某次捕獲的內(nèi)容,則可以使用捕獲變量為自定義標量變量賦值。

盡管我們有多種辦法避免在程序維護的時候使捕獲組編號錯亂,例如使用只具有模式分組功能的圓括號,但是使用順序編號的捕獲變量名稱仍會帶來很多麻煩。從  Perl 5.10  開始,允許用戶為捕獲變量自定義命名,稱為標簽(  label  ),其寫法為在相應(yīng)捕獲組括號里最開頭添加問好  ?  和  label  ,也即  (?<label>  正則表達式  )  。最終捕獲內(nèi)容會被儲存在特殊的哈希  %+  里面,其  key  即  label  ,  value  為括號內(nèi)正則表達式匹配的內(nèi)容,可以采用訪問哈希  %+  的方法來使用捕獲變量,使用自定義  label  改寫前面的程序如下所示:
$_ = "Hello there, neighbor";if (/(?<name1>\S+).*,\s(?<name2>\w+)/) {   print "What I said is:\n$+{name1} $+{name2}!\n";}
其運行效果與前面相同。同理,在正則表達式里的反向引用可以使用  \g{label}  或者  \k{label}  。此外,  Perl  還有三個自動捕獲變量,其中  $&  內(nèi)儲存的是正則表達式匹配的全部內(nèi)容,  $`  內(nèi)儲存的是匹配區(qū)段之前的內(nèi)容,  $'  內(nèi)儲存的是匹配區(qū)段之后的內(nèi)容。這三個捕獲變量可以隨意使用,但代價是會使程序運行變慢。在  Perl 5.10  及以上的版本,這三個變量有另一種更形象的寫法  ${^PREMATCH}  、  ${^MATCH}  、  ${^POSTMATCH}  。

以上是“如何在Perl中使用正則表達式”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI