perl regular expression

perl regular expression --- 正則表達式

正則表達式是Perl語言的一大特色,也是Perl程式中的難點,不過如果能夠很好的掌握他,就可以輕易地用正則表達式來完成字元串處理的任務,當然在CGI程式設計中就更能得心應手了。

perl regular expressionperl regular expression

正則表達式的三種形式

Perl程式中,正則表達式有三種存在形式,分別是:

匹配:m/;/(還可以簡寫為/;/,略去m)
替換:s/;/;/
轉化:tr/;/;/

這三種形式一般都和=~或!~搭配使用(其中"=~"表示相匹配,在整條語句中讀作does,"!~"表示不匹配,在整條語句中讀作doesn't),並在左側有待處理的標量變數。如果沒有該變數和=~!~操作符,則默認為處理$_變數中的內容。舉例如下:

$str="IlovePerl";
$str=~m/Perl/;#表示如果在$str中發現"Perl"字元串,則返回"1"否則返回"0"。
$str=~s/Perl/BASH/;#表示將變數$str中的"Perl"字元串替換為"BASH",如果發生此替換則返回"1",否則返回"0"。
$str!~tr/A-Z/a-z/;#表示將變數$str中的所有大寫字母轉化為小寫字母,如果轉化發生了則返回"0",否則返回"1"。

另外還有:

foreach(@array){s/a/b/;}#此處每次循環將從@array數組中取出一個元素存放在$_變數中,並對$_進行替換處理。
while(;){printif(m/error/);}#這一句稍微複雜一些,他將列印FILE檔案中所有包含error字元串的行。

Perl的正則表達式中如果出現(),則發生匹配或替換後()內的模式被Perl解釋器自動依次賦給系統$1,$2......請看下面的例子:

$string="Iloveperl";
$string=~s/(love)/;/;#此時$1="love",並且該替換的結果是將$string變為"I;perl"
$string="iloveperl";
$string=~s/(i)(.*)(perl)/;$2;/;#這裡$1="i",$2="love",$3="perl",並且替換後$string變為";love;"

替換操作s/;/;/還可以在末尾加上e或g參數,他們的含義分別為:

s/;/;/g表示把待處理字元串中所有符合;的模式全部替換為;字元串,而不是只替換第一個出現的模式。
s/;/;/e表示將把;部分當作一個運算符,這個參數用的不多。

比如下面的例子:

$string="i:love:perl";
$string=~s/:/*/;#此時$string="i*love:perl";
$string="i:love:perl";
$string=~s/:/*/g;#此時$string="i*love*perl";
$string=~tr/*//;#此時$string="iloveperl";
$string="www22cgi44";
$string=~s/(\d+)/$1*2/e;#(/d+)代表$string中的一個或多個數字字元,將這些數字字元執行*2的操作,因此最後$string變成了"www44cgi88"。

下面給出一個完整的例子:

#!/usr/bin/perl

print"請輸入一個字元串!\n";
$string=;;#;代表標準輸入,會讓使用者輸入一字元串
chop($string);#將$string最後一個換行的字元\n刪除掉
if($string=~/perl/){
print("輸入的字元串中有perl這個字元串!\n";
}

如果輸入的字元串含有perl這個字元串的話,就會顯示後面的提示信息。

perl regular expressionperl regular expression

正則表達式中的常用模式

下面是正則表達式中的一些常用模式。

/pattern/結果
.匹配除換行符以外的所有字元
x?匹配0次或一次x字元串
x*匹配0次或多次x字元串,但匹配可能的最少次數
x+匹配1次或多次x字元串,但匹配可能的最少次數
.*匹配0次或一次的任何字元
.+匹配1次或多次的任何字元
{m}匹配剛好是m個的指定字元串
{m,n}匹配在m個以上n個以下的指定字元串
{m,}匹配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/ii這個參數表示忽略英文大小寫,也就是在匹配字元串的時候,不考慮英文的大小寫問題。
\如果要在pattern模式中找尋一個特殊字元,如"*",則要在這個字元前加上\符號,這樣才會讓特殊字元失效

下面給出一些例子:

範例說明
/perl/找到含有perl的字元串
/^perl/找到開頭是perl的字元串
/perl$/找到結尾是perl的字元串
/c|g|i/找到含有c或g或i的字元串
/cg{2,4}i/找到C後面跟著2個到4個g,再跟著i的字元串
/cg{2,}i/找到c後面跟著2個以上g,再跟著i的字元串
/cg{2}i/找到c後面跟著2個g,再跟著i的字元串
/cg*i/找到c後面跟著0個或多個g,再跟著i的字元串,如同/cg{0,1}i/
/cg+i/找到c後面跟著一個以上g,再跟著i的字元串,如同/cg{1,}i/
/cg?i/找到c後面跟著0個或是1個g,再跟著i的字元串,如同/cg{0,1}i/
/c.i/找到c後面跟著一個任意字元,再跟著i的字元串
/c..i/找到c後面跟著二個任意字元,再跟著i的字元串
/[cgi]/找到符合有這三個字符任意一個的字元串
/[^cgi]/找到沒有這三個字元中任意一個的字元串
/\d/找尋符合數字的字元,可以使用/\d+/來表示一個或是多個數字組成的字元串
/\D/找尋符合不是數字的字元,可以使用/\D+/來表示一個或是更多個非數字組成的字元串
/\*/找尋符合*這個字元,因為*在常規表達式中有它的特殊意思,所以要在這個特殊符號前加上\符號,這樣才會讓這個特殊字元失效
/abc/i找尋符合abc的字元串而且不考慮這些字元串的大小寫

正則表達式的八大原則

如果在Unix中曾經使用過sedawkgrep這些命令的話,相信對於Perl語言中的正則表達式(RegularExpression)不會感到陌生。Perl語言由於有這個功能,所以對字元串的處理能力非常強。在Perl語言的程式中,經常可以看到正則表達式的運用,在CGI程式設計中也不例外。

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

幾條正則表達式使用過程中的8大原則。

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

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

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

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

·原則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用(?..)語法給正則表達式提供擴展功能。(這一點請同學們課後看相關資料)

相關詞條

相關搜尋

熱門詞條

聯絡我們