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

1、Perl正則表達(dá)式簡(jiǎn)介

  • 正則表達(dá)式的起源

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

    • 英文名:regular expression

    • Ken Thompson將正則表達(dá)式引入U(xiǎn)nix

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

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

  • 正則表達(dá)式的定義

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

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

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

  • 常用工具中的正則表達(dá)式

    • 記事本中的正則表達(dá)式:查找、替換實(shí)際上就是正則表達(dá)式

    • World中正則表達(dá)式:查找、替換

    • Vi中的正則表達(dá)式:查找、替換

    • 正則表達(dá)式無處不在

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


        image.png
  • 正則表達(dá)式的特點(diǎn)

    • 靈活性、邏輯性和功能性非常的強(qiáng)

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

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

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

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

  • 正則表達(dá)式的語法

    • 一個(gè)正則表達(dá)式也稱為一個(gè)模式

    • 簡(jiǎn)單模式

      • 如果模式匹配的對(duì)象是$_,把模式寫在斜線/中

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

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

      • 如果匹配項(xiàng)本身含有斜線,使用反斜線

    • Unicode屬性

      • 利用字符的屬性進(jìn)行匹配

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

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

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

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

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

    • 模式分組

      • 利用小括號(hào)來進(jìn)行字符串的分組

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

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

      • 反斜線也不一定在括號(hào)后面

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

      • 擇一匹配,使用豎線|表示匹配時(shí)候的”或“

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

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

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

    • 電話號(hào)碼匹配

    • 姓名,郵箱匹配

3、Perl正則表達(dá)式和元字符

  • 正則表達(dá)式中的元字符

    • 元字符是一種特殊字符

    • 起通配作用

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

  • 元字符列表

    • 字符類:?jiǎn)巫址c數(shù)字


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


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


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


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


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


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

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


      image.png

4、Perl正則表達(dá)式的形式

  • 模式匹配

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

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

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

    • 匹配的表達(dá)式中,括號(hào)部分的匹配項(xiàng)用$標(biāo)號(hào)表示

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

    • $test = "China"; $target = ".*ina"; $test =~ m/$target/ ##該表達(dá)式的返回值為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
    
    • 模式匹配的選項(xiàng):


      image.png
  • 模式替換

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

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

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

    • 不支持替換成特殊字符

    • 模式替換的選項(xiàng)


      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)化

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

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

    • 將string1中的字符依次,逐個(gè)替換為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/

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

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


      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正則表達(dá)式的原則

  • 原則一:

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

    • 正則表達(dá)式僅對(duì)標(biāo)量進(jìn)行匹配
  • 原則三:

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

    • 正則表達(dá)式能夠處理雙引號(hào)所能處理的任意和全部字符
  • 原則五:

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

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

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

  • 原則六:

    • 正則表達(dá)式的核心能力在于通配符和多重匹配運(yùn)算符

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

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

  • 原則七:

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

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

  • 原則八:

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

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

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

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

  • 說明:

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容