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


一:模式匹配中的特殊字符

1:  點號 .

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

2:  反斜線 \

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

3:  +

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

4:  *

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

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:運行到第一個斷點處

      

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM