Perl語言學(xué)習(xí)(五)Perl正則表達式

1、Perl正則表達式簡介

  • 正則表達式的起源

    • 1956年,論文《神經(jīng)網(wǎng)絡(luò)事件的表示法》首次提出“正則集的代數(shù)”表達式

    • 英文名:regular expression

    • Ken Thompson將正則表達式引入Unix

    • 此后廣泛應(yīng)用于Unix或者類Unix工具中

    • 主流操作系統(tǒng)悍缠、主流開發(fā)語言都嵌入了正則表達式

  • 正則表達式的定義

    • 正則表達式,就是用某種模式去匹配一類字符串的一個公式
    image.png
    • 給定一個正則表達式和另一個字符串第喳,我們可以達到如下的目的:

      • 給定的字符串是否符合正則表達式的過濾邏輯(稱作為“匹配”)

      • 可以通過正則表達式,從字符串中獲取我們想要的特定部分

  • 常用工具中的正則表達式

    • 記事本中的正則表達式:查找踱稍、替換實際上就是正則表達式

    • World中正則表達式:查找墩弯、替換

    • Vi中的正則表達式:查找、替換

    • 正則表達式無處不在

      • 不同環(huán)境中所支持的功能可能不太一樣


        image.png
  • 正則表達式的特點

    • 靈活性寞射、邏輯性和功能性非常的強

    • 主要應(yīng)用對象是文本

    • 可以迅速的用極簡單的方式達到字符串的復(fù)雜控制

    • 對于剛接觸的人來說。比較晦澀難懂

2锌钮、Perl正則表達式的應(yīng)用

  • 正則表達式的語法

    • 一個正則表達式也稱為一個模式

    • 簡單模式

      • 如果模式匹配的對象是$_桥温,把模式寫在斜線/中

      • 能匹配上,返回值為1梁丘,否則為0

      • $_ = "hello World"; if(/"World"/) {printf"It matched"};

      • 如果匹配項本身含有斜線侵浸,使用反斜線

    • Unicode屬性

      • 利用字符的屬性進行匹配

      • \p{屬性名}表示該屬性的模式

      • 匹配空格,使用Space屬性:\p{Space}

      • 匹配數(shù)字氛谜,使用Digit屬性:\p{Digit}

      • 匹配十六進制數(shù)掏觉,使用Hex屬性:\p{Hex}

      • 也可以使用\P來表示匹配不包含屬性的部分,\P{屬性}值漫,同不匹配不一樣

    • 模式分組

      • 利用小括號來進行字符串的分組

      • 括號澳腹、反斜線、數(shù)字編號可以組成捕獲組的模式

      • 括號內(nèi)的內(nèi)容作為元字符杨何,用反斜線后面加數(shù)字表示再此匹配

      • 反斜線也不一定在括號后面

      • /(world)\3/表示匹配:worldworldworldworld

      • 擇一匹配酱塔,使用豎線|表示匹配時候的”或“

      • /(hello|world)/表示匹配“hello”或“world"

  • 正則表達式的應(yīng)用場合

    • 針對所有的字符串處理,如特定字符串危虱、重復(fù)羊娃、計數(shù)、統(tǒng)計等

    • 電話號碼匹配

    • 姓名埃跷,郵箱匹配

3蕊玷、Perl正則表達式和元字符

  • 正則表達式中的元字符

    • 元字符是一種特殊字符

    • 起通配作用

    • 在他們前面加上反斜杠\,這些元字符就會失去其特殊含義

  • 元字符列表

    • 字符類:單字符與數(shù)字


      image.png
    • 字符類:空白字符


      image.png
    • 字符類:錨定字符


      image.png
    • 字符類:重復(fù)字符


      image.png
    • 字符類:替換字符


      image.png
    • 字符類:其他字符


      image.png
  • 元字符的優(yōu)先級

    • 當(dāng)模式中包含多種元字符時弥雹,根據(jù)優(yōu)先級順序來判斷匹配量


      image.png

4垃帅、Perl正則表達式的形式

  • 模式匹配

    • 得到“是否匹配”的結(jié)果,無其他操作

    • 形式為:m/<regexp>/; 或者/<regexp>/; 或者m?<regexp>?

    • 同匹配操作符一起剪勿,用來判斷是否匹配后面的字符串

    • 匹配的表達式中挺智,括號部分的匹配項用$標(biāo)號表示

    • 匹配上,返回值為1,否則為0

    • $test = "China"; $target = ".*ina"; $test =~ m/$target/ ##該表達式的返回值為1

     $string = "This string contains the number 25.11";
     $test = $string =~ /?(\d+)\.?(\d+)/;
     print $string."\n";    ## This string contains the number 25.11
     print $test."\n";   ## 1
     $a = $1;
     $b = $2;
     ?
     print $a."\n";   ## 25
     print $b."\n";   ## 11
    
    • 模式匹配的選項:


      image.png
  • 模式替換

    • 替換操作赦颇,返回值為布爾值

    • 形式為:s/<regexp>/<replacement>; 或者s?<regexp>?<replacement>

    • 同匹配操作符一起二鳄,修改被替換的部分

    • 不支持替換成特殊字符

    • 模式替換的選項


      image.png
      $var = "0abc1";
      $var =~ s/[a-zA-Z]+/3*2/e;
      print $var."\n";   ## 061
      ?
      $var =~ s/[a-zA-Z]+/3*2/;
      print $var."\n";   ## 03*21
      
  • 模式轉(zhuǎn)化

    • 同模式替換類似,用以彌補模式替換的不足

    • 形式為:tr/<regexp>/<replacement>; 或則tr?<regexp>?<replacement>

    • 將string1中的字符依次媒怯,逐個替換為string2的字符

    • 返回值為替換的字符數(shù)

      $var = "abcdfghicba";
      print $var."\n";   ## abcdfghicba
      $result = $var =~ tr/abc/def/; 
      print $var."\n";   ## defdfghifed
      print $result."\n";   ## 6
      print "------------------------\n";
      
    • 模式轉(zhuǎn)換的特殊功能

      • 大小寫轉(zhuǎn)換:$str =~ tr/a-zA-Z/A-Za-z/

      • 特定字符的計數(shù):$str =~ tr/0-9/0-9/

    • 模式轉(zhuǎn)換的選項


      image.png
      $var = "123abc";
      print $var."\n";   ## 123abc
      $var =~ tr/0-9/ /c; 
      print $var."\n";   ## 123
      ?
      $var =~ tr/1b//d;
      print $var."\n";   ## 23ac
      ?
      $var = "12abc3abc";
      $var =~ tr/0-9/ /cs;
      print $var."\n";   ## 12 3
      

5订讼、Perl正則表達式的原則

  • 原則一:

    • 正則表達式有三種不同形式,分為匹配扇苞,替換和轉(zhuǎn)化
  • 原則二:

    • 正則表達式僅對標(biāo)量進行匹配
  • 原則三:

    • 匹配時欺殿,默認(rèn)只匹配/替換一次,且對象為最早的可能匹配
  • 原則四:

    • 正則表達式能夠處理雙引號所能處理的任意和全部字符
  • 原則五:

    • 正則表達式在求值過程中產(chǎn)生兩種情況:結(jié)果狀態(tài)和反向引用

    • $a =~ m/pattern/ ##產(chǎn)生的結(jié)果狀態(tài)鳖敷,布爾類型

    • $a =~ s/(word1)(word2)/$2$1/ ##產(chǎn)生的反向引用

  • 原則六:

    • 正則表達式的核心能力在于通配符和多重匹配運算符

    • $a =~ /\w+/ ##匹配一個或多個單詞

    • $a =~ m/\d/ ##匹配0個或多個數(shù)字

  • 原則七:

    • 如果匹配不止一個字符集合脖苏,可以使用“|”來增加靈活性

    • m/(cat|dog)/ ##可以匹配cat或者dog

  • 原則八:

    • Perl中用(?...)語法給正則表達式提供擴展功能

    • (?:pattern) 匹配pattern但不獲取匹配結(jié)果

    • (?=pattern) 正向預(yù)查,在任何匹配pattern的字符串開始處匹配查找字符串

    • (?!pattern) 負(fù)向預(yù)查定踱,在任何不匹配pattern的字符串開始處匹配查找字符串

  • 說明:

    • 在Perl的模式中棍潘,括號內(nèi)的子模式將存儲在內(nèi)存中,此功能即取消存儲該括號內(nèi)的匹配內(nèi)容

參考來源:https://www.jikexueyuan.com/course/1441.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崖媚,一起剝皮案震驚了整個濱河市亦歉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畅哑,老刑警劉巖肴楷,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荠呐,居然都是意外死亡赛蔫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門泥张,熙熙樓的掌柜王于貴愁眉苦臉地迎上來濒募,“玉大人,你說我怎么就攤上這事圾结」逄辏” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵筝野,是天一觀的道長晌姚。 經(jīng)常有香客問我,道長歇竟,這世上最難降的妖魔是什么挥唠? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮焕议,結(jié)果婚禮上宝磨,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好唤锉,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布世囊。 她就那樣靜靜地躺著,像睡著了一般窿祥。 火紅的嫁衣襯著肌膚如雪株憾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天晒衩,我揣著相機與錄音嗤瞎,去河邊找鬼。 笑死听系,一個胖子當(dāng)著我的面吹牛贝奇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播靠胜,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼掉瞳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了髓帽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤脑豹,失蹤者是張志新(化名)和其女友劉穎郑藏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘩欺,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡必盖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俱饿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌粥。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拍埠,靈堂內(nèi)的尸體忽然破棺而出失驶,到底是詐尸還是另有隱情,我是刑警寧澤枣购,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布嬉探,位于F島的核電站,受9級特大地震影響棉圈,放射性物質(zhì)發(fā)生泄漏涩堤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一分瘾、第九天 我趴在偏房一處隱蔽的房頂上張望胎围。 院中可真熱鬧,春花似錦、人聲如沸白魂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碧聪。三九已至冒版,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逞姿,已是汗流浹背辞嗡。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滞造,地道東北人续室。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像谒养,于是被迫代替她去往敵國和親挺狰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 捕獲組與反向引用 在正則表達式中买窟,圓括號的一大作用是進行模式分組丰泊,而其還有另一個非常重要的作用,即定義捕獲組始绍。捕獲...
    櫻雨樓閱讀 1,658評論 0 0
  • 初衷:看了很多視頻瞳购、文章,最后卻通通忘記了亏推,別人的知識依舊是別人的学赛,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 3,993評論 0 20
  • Python中的正則表達式(re) import rere.match #從開始位置開始匹配吞杭,如果開頭沒有則無re...
    BigJeffWang閱讀 7,064評論 0 99
  • 推薦幾個正則表達式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1閱讀 11,480評論 9 151
  • 一切可以妥當(dāng)?shù)囊欢〞桩?dāng)盏浇,準(zhǔn)備迎接奇跡! 感恩 中考成績出來以及各校分?jǐn)?shù)線公布好多親朋好友都對孩子很關(guān)心芽狗,很感恩绢掰!...
    belivePossible閱讀 74評論 0 0