perl學習(3)模式匹配與正則表達式

一:模式匹配中的特殊字符正則表達式

1:  點號 .函數

     匹配任何單個字符(換行符\n除外)ui

2:  反斜線 \spa

    轉義字符,用於特殊符號前,使其失去特殊字符的做用變成普通字符命令行

3:  +debug

    匹配該字符前面的字符(單個)至少一次;1次,2次...n次3d

4:  *對象

    匹配該字符前面的字符任意次:0次,1次...n次blog

5:  ?字符串

    匹配該字符前面的字符0次或者一次

6:  .*

    匹配任意字符任意次(換行符除外)

7:  {count}

    匹配前面的字符count次

8:  {min,}

    匹配前面的字符至少min次

9:  {min,max}

    匹配至少min,至多max

10:  *?

    匹配該字符前面的字符任意次:0次,1次...n次,傾向於短字符,非貪婪量詞

11:  +?

    匹配該字符前面的字符(單個)至少一次;1次,2次...n次,傾向於短字符,非貪婪量詞

12:  ()

    模式分組字符 eg:/(perl)+/  #有()匹配模式是perl,沒有括號,匹配模式是單個字符l;

    1)藉助模式分組,可使用\number的方向引用來引用括號內匹配的內容,n和括號內的組號匹配

    

    2)perl 5.10可使用\g{number}這種形式的反向引用,n能夠爲負數

    

              輸出:

13:  |

    或,即匹配左右均可

14:  例子

    

             輸出:

 二:  字符集

   字符集是指一串可能出現的字符集合。經過寫在方括號([ ])內來表示。只能用來匹配單個字符,但能夠是方括號內列出的任意一個   

     

              輸出:

1:  可使用字符 - 進行簡寫; [0-9]表示0到9十個數字

2:  可使用脫字符 ^ 匹配字符集外的字符

3:  字符集簡寫

    

    說明:\d 匹配任意的數字, \w匹配任意的字母數字下劃線 ,\s匹配任意的空格,

     

4:  例子

    

              輸出:

    問題:test_id = 20010的\w\s+匹配一個字符多個空格;按道理匹配不了啊,但輸出匹配成功

5:  經常使用字符集

    /[\dA-Fa-f]+/   :匹配16進制數

    /\d\D/              :匹配任意字符

    /^\d\D/            :什麼字符都不匹配

四:  模式匹配操做符與修飾符

1:   操做符

      在前面的介紹與例子中,咱們使用 // 來進行匹配(其實是m//);

    模式匹配操做符可使用任意成對的定界符,當使用斜線做爲定界符時,開頭的m能夠省略

    eg:m(fred),m<fred>,m{fred},m[fred]

      m%http://% 

2:  修飾符(在操做符後面,其實與操做符的/符號合用)

    1)/i  

     進行模式匹配時,將不區分大小寫

    2)/s

    模式中的點號將匹配包括換行符在內的任意字符(注意與\s區分開來,\s是字符集裏匹配任意的空格的簡寫)

    3)/x

    忽略空白符,使用/x修飾符能夠在模式裏面隨意加上空白,使其更容易閱讀。

五:  錨位

1:  ^

     標誌字符串的開頭

2:  $

    標誌字符串的末尾,eg:/^\s*$/

3:    /b 指定特定的單詞

    單詞(\w+)錨位,匹配任何單詞的收尾

4:  /B

    非單詞錨位,匹配全部/b不能匹配的位置

 5:  例子

    

               輸出:

六:  綁定操做符=~

    默認狀況下,模式匹配的對象的$_,綁定操做符=~用於告訴perl拿右邊的模式匹配左邊的字符串,而不是匹配$_變量中的字符串

     

七:  模式串中的變量內插

    例如:

    my $val = "just";

    my $val2 = "This is just a test example";

    if ($val2 =~ /($val)/) { .... } #正則表達式中的變量內插,if ($val2 =~ /$(val)/)也可。

八:  捕獲

    把圓括號內的字符串暫時記憶下來的能力,若是有多個圓括號,就有多個捕獲。捕獲變量都是標量變量,依次爲$1,$2...$n

1:   捕獲週期

    捕獲變量一般能存活到下次成功的模式匹配爲止,即失敗的匹配不會改動上次工程匹配時捕獲的內容,而成功時會將它們重置。若是在數行以外使用捕獲變量,最好將捕獲變量的值復                      制到一個通常的變量裏 

     

                輸出:

2:  不匹配模式

    通常狀況下,模式使用的圓括號都會捕獲部分的匹配串到捕獲變量中,但若perl正則表達式容許使用括號但不作捕獲(不捕獲括號),須要在左括號的後面加上問號和冒號(?:)。

3:   命名捕獲

    管理$1,$2...是比較困難的,尤爲是對比較複雜的正則表達式而言。Perl5.10引入了正則表達式命名捕獲的概念。

    在命名捕獲中,捕獲結果保存在%+的特殊哈希中;模式加標籤的寫法是(?<LABEL>PATTERN),訪問爲$+{LABEL},可以使用\g{LABEL}或\k{LABEL}反向引用。

  例子:

    

                 輸出:

 4:  自動匹配變量

    $&:匹配括號的內容;$`:匹配內容前的字符;$’:匹配內容後的值(包括空格逗號等)

 

 九:  替換

1:  s///

    前兩個//裏是要替換的字符,後兩個//裏是替換的字符;返回布爾值,替換成功時爲真;只替換一個值

2:  /g

    全局替換;常寫在s///後面,/g的斜線省略

    

    輸出:

    

3:  不一樣的替換界定符

    和m//同樣,s///操做符也可使用其餘的定界符

    1)使用沒有左右之分的非成對符號,跟s///同樣,只需重複三次便可;eg:s#Barney#Fred#

    2)使用有左右之分的成對符號,必須使用兩對,一對圈引模式,一對圈引替換模式。圈引模式與圈引替換模式不必定要相同

    eg:s{barney}{fred};s[barney][fred];s<fred>#barney#

4:     替換修飾符 

     /g(全局替換)

     /i,/s,/x (四(2)同)

     /m 使模式匹配字符串內的換行符

5:  大小寫轉換

    

    例子:

    

               輸出:

 十:  split操做符

    根據指定的分隔符拆開一個字符串,返回子串的列表(即將一個字符串分解爲多個)。尤爲適用於處理被製表符,冒號,空白或其餘符號分割的數據

1:  語法規則

    @split = split /separator/,$string    or @split = split( /separator/,$string)

    split會保留開頭處的空字段,並省略結尾處的空字段

2:  例子

     

                  輸出:

    說明:多餘的冒號會被當成空字符

十一:  join函數

     將多個字符串片斷合併成一個字符串

        my $result = join $glue,@pieces; or my $result = join ($glue,@pieces)

       

                   輸出:

十二:  列表上下文中的m//

     通常狀況下,模式匹配操做符m//返回的是布爾值,若是在列表上下文中使用模式匹配操做符,將返回全部捕獲變量的列表

      eg:my $test = "hello,there,neighbor";

        my ($first,$second,$third) = ($test = ~ /(\S+) (S+), (S+)/); 大寫S是小寫s補集。

十三:  命令行執行perl

      perl -p -i.bak -w -e  's/Randall/Randal/g'  fred*.dat

       

十四:debug perl腳本

    1)在程序頭添加-d或者在終端perl -d filename.pl;打開debug模式

    2)DB<1>       l :list the next few lines;p $variable name: 輸出變量值;  q:quit;  

            r:從子函數中返回;      R:再次運行;    n:單步執行,不進入子函數(F10)

            s:單步執行(F11),進入子函數;

            b:放斷點,如b 20 在第二十行放斷點 ;   c:運行到第一個斷點處

相關文章
相關標籤/搜索