perl學習(3)正規表示式

2021-09-06 04:23:49 字數 4439 閱讀 2141

正規表示式。所謂正規表示式,是由斜槓圈起的一組字元集合。它們可用於在文字中匹配指定模

式,並進行相應替換操作。一直以來,perl 都因為其優秀的模式匹配機制而聞名於世。

表2-2 一些正規表示式元字元

元字元表達含義

^匹配行首

$ 匹配行尾

a.c

匹配乙個a,後面任意單個字元,再後面是乙個c 的情況

[abc]

匹配a 或者b 或者c 的情況

[^abc]

匹配字元既不是a 又不是b 也不是c 的情況

[0-9]

匹配位於0 到9 之間的單個數字

ab*c

匹配乙個a 後面跟0 到多個b,最後是乙個c 的情況

ab+c

匹配乙個a 後面跟1 到多個b,最後是乙個c 的情況

ab?c

匹配乙個a 後面跟0 到1 個b,最後是乙個c 的情況

(ab)+c

匹配1 到多個ab 後面跟著1 個c 的情況

(ab)(c)

捕獲ab 並將其值賦予變數$1,同時捕獲c 值並賦予$2

正規表示式的三種形式:

首先我們應該知道 perl 程式中,正規表示式有三種存在形式,他們分別是:

1、匹配:m/;/ (還可以簡寫為 /;/ ,略去 m)

2、替換:s/;/;/

3、轉化:tr/;/;/

三種形式對應的範例:

$mystring = "i am love perl!"

;

print("給定的字串為:$mystring\n");
if($mystring =~ m/perl/)
$mystring =~ s/perl/best/;
print("替換過後的字串為:$mystring\n");
$mystring =~ tr/a-z/a-z/;
print("轉換過後的字串為:$mystring\n");

正規表示式中的常用模式

下面是正規表示式中的一些常用模式。

/pattern/ 結果

. 匹配除換行符以外的所有字元

x? 匹配 0 次或一次 x 字串

x* 匹配 0 次或多次 x 字串,但匹配可能的最少次數

x+ 匹配 1 次或多次 x 字串,但匹配可能的最少次數

.* 匹配 0 次或一次的任何字元

.+ 匹配 1 次或多次的任何字元

匹配剛好是 m 個 的指定字串

匹配在 m個 以上 n個 以下 的指定字串

匹配 m個 以上 的指定字串

匹配符合 內的字元

[^] 匹配不符合 內的字元

[0-9] 匹配所有數字字元

[a-z] 匹配所有小寫字母字元

[^0-9] 匹配所有非數字字元

[^a-z] 匹配所有非小寫字母字元

^ 匹配字元開頭的字元

$ 匹配字元結尾的字元

\d 匹配乙個數字的字元,和 [0-9] 語法一樣

\d+ 匹配多個數字字串,和 [0-9]+ 語法一樣

\d 非數字,其他同 \d

\d+ 非數字,其他同 \d+

\w 英文本母或數字的字串,和 [a-za-z0-9] 語法一樣

\w+ 和 [a-za-z0-9]+ 語法一樣

\w 非英文本母或數字的字串,和 [^a-za-z0-9] 語法一樣

\w+ 和 [^a-za-z0-9]+ 語法一樣

\s 空格,和 [\n\t\r\f] 語法一樣

\s+ 和 [\n\t\r\f]+ 一樣

\s 非空格,和 [^\n\t\r\f] 語法一樣

\s+ 和 [^\n\t\r\f]+ 語法一樣

\b 匹配以英文本母,數字為邊界的字串

\b 匹配不以英文本母,數值為邊界的字串

a|b|c 匹配符合a字元 或是b字元 或是c字元 的字串

abc 匹配含有 abc 的字串

(pattern) () 這個符號會記住所找尋到的字串,是乙個很實用的語法。第乙個 () 內所找到的字串變成 $1 這個變數或是 \1 變數,

第二個 () 內所找到的字串變成 $2 這個變數或是 \2 變數,以此類推下去。

/pattern/i i 這個引數表示忽略英文大小寫,也就是在匹配字串的時候,不考慮英文的大小寫問題。

\ 如果要在 pattern 模式中找尋乙個特殊字元,如 "*",則要在這個字元前加上 \ 符號,這樣才會讓特殊字元失效

下面給出一些例子:

範例 說明

/perl/ 找到含有 perl 的字串

/^perl/ 找到開頭是 perl 的字串

/perl$/ 找到結尾是 perl 的字串

/c|g|i/ 找到含有 c 或 g 或 i 的字串

/cgi/ 找到 c 後面跟著 2個到 4個 g ,再跟著 i 的字串

/cgi/ 找到 c 後面跟著 2個以上 g ,再跟著 i 的字串

/cgi/ 找到 c 後面跟著 2個 g,再跟著 i 的字串

/cg*i/ 找到 c 後面跟著 0個或多個 g ,再跟著 i 的字串,如同/cgi/

/cg+i/ 找到 c 後面跟著乙個以上 g,再跟著 i 的字串,如同/cgi/

/cg?i/ 找到 c 後面跟著 0個或是 1個 g ,再跟著 i 的字串,如同/cgi/

/c.i/ 找到 c 後面跟著乙個任意字元,再跟著 i 的字串

/c..i/ 找到 c 後面跟著二個任意字元,再跟著 i 的字串

/[cgi]/ 找到符合有這三個字元任意乙個的字串

/[^cgi]/ 找到沒有這三個字元中任意乙個的字串

/\d/ 找尋符合數字的字元,可以使用/\d+/來表示乙個或是多個數字組成的字串

/\d/ 找尋符合不是數字的字元,可以使用/\d+/來表示乙個或是更多個非數字組成的字串

/\*/ 找尋符合 * 這個字元,因為 * 在常規表示式中有它的特殊意思,所以要在這個特殊符號前加上 \ 符號,這樣才會讓這個特殊字元失效

/abc/i 找尋符合 abc 的字串而且不考慮這些字串的大小寫

正規表示式的八大原則

如果在 unix 中曾經使用過 sed、awk、grep 這些命令的話,相信對於 perl 語言中的正規表示式(regular expression)不會感到陌生。

perl 語言由於有這個功能,所以對字串的處理能力非常強。在perl語言的程式中,經常可以看到正規表示式的運用,在 cgi 程式設計中也不例外。

正規表示式是初學 perl 的難點所在,不過只要一旦掌握其語法,你就可以擁有幾乎無限的模式匹配能力,而且 perl 程式設計的大部分工作都是掌握常規表示式。

下面給大家介紹幾條正規表示式使用過程中的 8 大原則。

正規表示式在對付資料的戰鬥中可形成龐大的聯盟——這常常是一場戰爭。我們要記住下面八條原則:

· 原則1:正規表示式有三種不同形式(匹配(m/ /),替換(s/ / /eg)和轉換(tr/ / /))。

· 原則2:正規表示式僅對標量進行匹配( $scalar =~ m/a/; 可以工作; @array =~ m/a/ 將把@array作為標量對待,因此可能不會成功)。

· 原則3:正規表示式匹配乙個給定模式的最早的可能匹配。預設時,僅匹配或替換正規表示式一次( $a = 'string string2'; $a =~ s/string/ /; 導致 $a = 'string 2')。

· 原則4:正規表示式能夠處理雙引號所能處理的任意和全部字元( $a =~ m/$varb/ 在匹配前把varb擴充套件為變數;如果 $varb = 'a' $a = 'as',$a =~ s/$varb/ /; 等價於 $a =~ s/a/ /; ,執行結果使 $a = " s" )。

· 原則5:正規表示式在求值過程中產生兩種情況:結果狀態和反向引用: $a=~ m/pattern/ 表示 $a 中是否有子串 pattern 出現,$a =~ s/(word1)(word2)/$2$1/ 則「調換」這兩個單詞。

· 原則6:正規表示式的核心能力在於萬用字元和多重匹配運算子以及它們如何操作。$a =~ m/\w+/ 匹配乙個或多個單詞字元;$a =~ m/\d/" 匹配零個或多個數字。

· 原則7:如果欲匹配不止乙個字元集合,perl使用 "|" 來增加靈活性。如果輸入 m/(cat|dog)/ 則相當於「匹配字串 cat 或者 dog。

· 原則8:perl用 (?..) 語法給正規表示式提供擴充套件功能。(這一點請同學們課後看相關資料)

想要學習所有這些原則?我建議大家先從簡單的開始,並且不斷的嘗試和實驗。實際上如果學會了 $a =~ m/error/ 是在 $a 中查詢子串error,

那麼你就已經比在 c 這樣的低層語言中得到了更大的處理能力

perl學習(3)正規表示式

正規表示式。所謂正規表示式,是由斜槓圈起的一組字元集合。它們可用於在文字中匹配指定模 式,並進行相應替換操作。一直以來,perl 都因為其優秀的模式匹配機制而聞名於世。表2 2 一些正規表示式元字元 元字元表達含義 匹配行首 匹配行尾 a.c 匹配乙個a,後面任意單個字元,再後面是乙個c 的情況 a...

Perl 正規表示式

正規表示式文中列表 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個後向引用 或乙個八進位制轉義符。匹配輸入字串的開始位置。如果設定了 regexp 物件的multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置。如果設定了 regexp 物件的multiline 屬性...

Perl正規表示式

元字元 元字元的含義是具有特殊含義的字元,即為元字元,元字元包括 點號能夠匹配所有的單字元,但是換行字元除外 n 簡易量詞 記載匹配正規表示式的時候有些需要重複的字元或者字串,我們在表示這種重複的形式的時候,即是量詞,我們知道的量詞有 表示至少重複一次,表示重複一次或者一次 以上,指的是重複一次或者...