亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

發布時間:2021-12-06 14:07:50 來源:億速云 閱讀:306 作者:小新 欄目:大數據

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

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

⑴匹配模式

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

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

運行結果如下所示:

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

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

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

⑵模式修飾符

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

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

上面表格中不同的模式修飾符可以進行組合使用,而且其順序對模式沒有影響,如下所示:
/abc.*xyz/is      #忽略大小寫并使點號匹配任意字符

⑶錨位

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

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

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

⑷變量內插

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

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

⑸捕獲變量

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

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

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

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

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

向AI問一下細節

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

AI

龙海市| 大足县| 綦江县| 安化县| 望城县| 顺义区| 桂林市| 兴山县| 金乡县| 墨江| 淮北市| 西畴县| 包头市| 清新县| 江川县| 古交市| 杭州市| 会昌县| 高要市| 青川县| 日土县| 临泽县| 长宁县| 封开县| 洪雅县| 咸宁市| 青浦区| 德清县| 根河市| 江山市| 油尖旺区| 连云港市| 伊川县| 玛纳斯县| 日土县| 永川市| 石门县| 嘉兴市| 万荣县| 泉州市| 施甸县|