perl 模式匹配

2021-05-22 06:35:02 字數 2596 閱讀 6454

一、簡介

模式指在字串中尋找的特定序列的字元,由反斜線包含:/def/即模式def。其用法如結合函式split將字串用某模式分成多個單詞:@array = split(/ /, $line);

二、匹配操作符 =~、!~

=~檢驗匹配是否成功:$result = $var =~ /abc/;若在該字串中找到了該模式,則返回非零值,即true,不匹配則返回0,即false。!~則相反。

這兩個操作符適於條件控制中,如:

if ($question =~ /please/)

else

三、模式中的特殊字元

perl在模式中支援一些特殊字元,可以起到一些特殊的作用。

1、字元 +

+意味著乙個或多個相同的字元,如:/de+f/指def、deef、deeeeef等。它盡量匹配盡可能多的相同字元,如/ab+/在字串abbc中 匹配的將是abb,而不是ab。

當一行中各單詞間的空格多於乙個時,可以如下分割:

@array = split (/ +/, $line);

注:split函式每次遇到分割模式,總是開始乙個新單詞,因此若$line以空格打頭,則@array的第乙個元素即為空元素。但其可以區分是否真有單 詞,如若$line中只有空格,則@array則為空陣列。且上例中tab字元被當作乙個單詞。注意修正。

2、字元 和[^]

意味著匹配一組字元中的乙個,如/a[0123456789]c/將匹配a加數字加c的字串。與+聯合使用例:/d[ee]+f/匹配def、 def、deef、dedf、deeeeeeeef等。^表示除其之外的所有字元,如:/d[^dee]f/匹配d加非e字元加f的字串。

3、字元 *和?

它們與+類似,區別在於*匹配0個、1個或多個相同字元,?匹配0個或1個該字元。如/de*f/匹配df、def、deeeef等;/de?f/匹配 df或def。

4、轉義字元

如果你想在模式中包含通常被看作特殊意義的字元,須在其前加斜線"/"。如://*+/中/*即表示字元*,而不是上面提到的乙個或多個字元的含義。斜線 的表示為。在perl5中可用字元對/q和/e來轉義。

5、匹配任意字母或數字

上面提到模式/a[0123456789]c/匹配字母a加任意數字加c的字串,另一種表示方法為:/a[0-9]c/,類似的,[a-z]表示任意小 寫字母,[a-z]表示任意大寫字母。任意大小寫字母、數字的表示方法為:/[0-9a-za-z]/。

6、錨模式

描述^ 或 /a 僅匹配串首 $ 或 /z 僅匹配串尾 /b 匹配單詞邊界 /b 單詞內部匹配

例1:/^def/只匹配以def打頭的字串,/$def/只匹配以def結尾的字串,結合起來的/^def$/只匹配字串def(?)。/a和 /z在多行匹配時與^和$不同。

例2:檢驗變數名的型別:

if ($varname =~ /^/$[a-za-z][_0-9a-za-z]*$/) elsif ($varname =~ /^@[a-za-z][_0-9a-za-z]*$/) elsif ($varname =~ /^[a-za-z][_0-9a-za-z]*$/) else

例3:/b在單詞邊界匹配://bdef/匹配def和defghi等以def打頭的單詞,但不匹配abcdef。/def/b/匹配def和 abcdef等以def結尾的單詞,但不匹配defghi,//bdef/b/只匹配字串def。注意://bdef/可匹配$defghi,因為$並 不被看作是單詞的部分。

例4:/b在單詞內部匹配://bdef/匹配abcdef等,但不匹配def;/def/b/匹配defghi等;//bdef/b/匹配cdefg、 abcdefghi等,但不匹配def,defghi,abcdef。

7、模式中的變數替換

將句子分成單詞:

$pattern = "[//t ]+";

@words = split(/$pattern/, $line);

8、字元範圍轉義

e轉義字元 描述 範圍 /d 任意數字 [0-9]

/d 除數字外的任意字元 [^0-9]

/w 任意單詞字元 [_0-9a-za-z]

/w 任意非單詞字元 [^_0-9a-za-z]

/s 空白 [ /r/t/n/f] /s 非空白 [^ /r/t/n/f]    例:/[/da-z]/匹配任意數字或小寫字母。

9、匹配任意字元

字元"."匹配除換行外的所有字元,通常與*合用。

10、匹配指定數目的字元

字元對{}指定所匹配字元的出現次數。如:/def/匹配def,deef和deeef;/def/匹配deeef;/def /匹配不少於3個e在d和f之間;/def/匹配不多於3個e在d和f之間。

11、指定選項

字元"|"指定兩個或多個選擇來匹配模式。如:/def|ghi/匹配def或ghi。

例:檢驗數字表示合法性

if ($number =~ /^-?/d+$|^-?0[xx][/da-fa-f]+$/) else

其中 ^-?/d+$ 匹配十進位制數字,^-?0[xx][/da-fa-f]+$ 匹配十六進製制數字。

12、模式的部分重用

當模式中匹配相同的部分出現多次時,可用括號

Perl的模式匹配

perl基本的模式匹配有兩種 m pattern 只匹配 s pattern replacement 匹配並替換其中分隔符反斜槓 可以用任意特殊字元替換 但在m pattern 簡寫為 pattern 時不能這樣做,換種說法,即若分隔符是反斜槓 則m pattern 可簡寫為 pattern 模式匹...

perl正則匹配

字元的種類是一定的,無非是空格,數字,大小寫字母,和perl中定義的元字元,還有本國語言。所以原則上任何格式的字元都能匹配。匹配工具 選擇符號,關鍵字,量詞,斷言,轉義字元 當出現多個字元組成的 非空格字元時候,例如123,45 3 s sdgg 則使用 0 9a za z 若加上 則只能匹配一行中...

perl智慧型匹配

1.perl中 為智慧型匹配,它可以智慧型地根據符號兩側的運算元來確定操作。如要判斷某個元素是否存在於陣列中,不使用智慧型匹配,程式像這樣 my x 2 my array 1,2,3 my flag 0 for array if flag 1 else 使用智慧型匹配,程式像這樣 my x 2 my...