Perl學(xué)習(xí)筆記---Perl模式匹配
本文和大家重點(diǎn)討論一下Perl模式匹配的概念,主要包括Perl模式匹配的語(yǔ)法和特殊字符等內(nèi)容,希望通過(guò)本文的介紹你對(duì)Perl模式匹配的概念有明確的認(rèn)識(shí)。
Perl模式匹配
模式指在字符串中尋找的特定序列的字符,由反斜線包含:/def/即模式def。
一、Perl模式匹配的語(yǔ)法
m/def/
例如if(m/def/){}這是在$_中尋找def匹配.如果將模式括起來(lái)的字符(稱為界限符)是斜杠,那么編寫(xiě)Perl模式匹配代碼時(shí)也可以不帶m。
/def/
Perl模式匹配的操作符=~,!~若在該字符串中找到了該模式,則返回非零值,即true,不匹配則返回0,即false。!~則相反。這兩者適合條件控制.
例如
- if($question=~/please/)
- {
- print("Thankyouforbeingpolite!\n");
- }
二、Perl模式匹配中的特殊字符
2.1+
+用于使前面的字符與后面的字符至少匹配一次,也可以任意次地進(jìn)行匹配.類似于windows中*例如/d+g/能匹配的dog,dogg,dooooog/ab+/在字符串a(chǎn)bbc中匹配的將是abb,而不是ab。
2.2[]和[^]
[]意味著匹配一組字符中的一個(gè)
^表示除其之外的所有字符
例如/w[abcd]s/能匹配的was,wbs,wcs,wds
/w[^ab]s/不能匹配的was,wbs
也可以寫(xiě)成如下形式
/w[a-z0-9A-Z]s/
2.3字符*和?
它們與+類似,區(qū)別在于*匹配0個(gè)、1個(gè)或多個(gè)相同字符,?匹配0個(gè)或1個(gè)該字符。
例如/de*f/匹配df、def、deeeef等;/de?f/匹配df或def。
2.4位置通配符(錨模式)
^或\A僅匹配串首
$或\Z僅匹配串尾
\b匹配單詞邊界
\B單詞內(nèi)部匹配
例如:/^def/只匹配以def打頭的字符串,/$def/只匹配以def結(jié)尾的字符串,結(jié)合起來(lái)的/^def$/只匹配字符串def(?)。\A和\Z在多行匹配時(shí)與^和$不同。
\b在單詞邊界匹配:/\bdef/匹配def和defghi等以def打頭的單詞,但不匹配abcdef。/def\b/匹配def和abcdef等以def結(jié)尾的單詞,但不匹配defghi,/\bdef\b/只匹配字符串def。注意:/\bdef/可匹配$defghi,因?yàn)椤绮⒉槐豢醋魇菃卧~的部分。
\B在單詞內(nèi)部匹配:/\Bdef/匹配abcdef等,但不匹配def;/def\B/匹配defghi等;/\Bdef\B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。
2.5字符轉(zhuǎn)義類
\d任意數(shù)字[0-9]
\D除數(shù)字外的任意字符[^0-9]
\w任意單詞字符[_0-9a-zA-Z]
\W任意非單詞字符[^_0-9a-zA-Z]
\s空白[\r\t\n\f]
\S非空白[^\r\t\n\f]
2.6.
字符"."匹配除換行外的所有字符,通常與*合用。
2.7匹配指定數(shù)目的字符
字符對(duì){}指定所匹配字符的出現(xiàn)次數(shù)。
如:/de{1,3}f/匹配def,deef和deeef;
/de{3}f/匹配deeef;
/de{3,}f/匹配不少于3個(gè)e在d和f之間;
/de{0,3}f/匹配不多于3個(gè)e在d和f之間。
2.8指定選項(xiàng)
字符"|"指定兩個(gè)或多個(gè)選擇來(lái)匹配模式。如:/def|ghi/匹配def或ghi。
這些轉(zhuǎn)義符有一定的操作順序:
()模式內(nèi)存
+*?{}出現(xiàn)次數(shù)
^$\b\B錨
|選項(xiàng)
2.9模式次序變量
在Perl模式匹配后調(diào)用重用部分的結(jié)果可用變量$n,全部的結(jié)果用變量$&。
$string="Thisstringcontainsthenumber25.11.";
$string=~/-?(\d+)\.?(\d+)/;#匹配結(jié)果為25.11
$integerpart=$1;#now$integerpart=25
$decimalpart=$2;#now$decimalpart=11
$totalpart=$&;#nowtotalpart=25.11 #p#
三、Perl模式匹配選項(xiàng)
g匹配所有可能的模式
i忽略大小寫(xiě)
m將串視為多行
o只賦值一次
s將串視為單行
x忽略模式中的空白
3.1、匹配所有可能的模式(g選項(xiàng))
@matches="balata"=~/.a/g;#now@matches=("ba","la","ta")
匹配的循環(huán):
- while("balata"=~/.a/g){
- $match=$&;
- print("$match\n");
- }
結(jié)果為:
ba
la
ta
當(dāng)使用了選項(xiàng)g時(shí),可用函數(shù)pos來(lái)控制下次匹配的偏移:
$offset=pos($string);
pos($string)=$newoffset;
3.2、忽略大小寫(xiě)(i選項(xiàng))例
/de/i匹配de,dE,De和DE。
3.3、將字符串看作多行(m選項(xiàng))
在此情況下,^符號(hào)匹配字符串的起始或新的一行的起始;$符號(hào)匹配任意行的末尾。
3.4、只執(zhí)行一次變量替換例
- $var=1;
- $line=<STDIN>;
- while($var<10){
- $result=$line=~/$var/o;
- $line=<STDIN>;
- $var++;
- }
每次均匹配/1/。
3.5、將字符串看作單行例
/a.*bc/s匹配字符串a(chǎn)xxxxx\nxxxxbc,但/a.*bc/則不匹配該字符串。
3.6、在模式中忽略空格
/\d{2}([\W])\d{2}\1\d{2}/x等價(jià)于/\d{2}([\W])\d{2}\1\d{2}/。
四、Perl模式匹配的附加操作
4.1替換操作符
語(yǔ)法為s/pattern/replacement/,其效果為將字符串中與pattern匹配的部分換成replacement。如:
$string="abc123def";
$string=~s/123/456/;#now$string="abc456def";
在替換部分可使用模式次序變量$n,如s/(\d+)/[$1]/,但在替換部分不支持模式的特殊字符,如{},*,+等,如s/abc/[def]/將把a(bǔ)bc替換為[def]。
替換操作符的選項(xiàng)如下表:
g改變模式中的所有匹配
i忽略模式中的大小寫(xiě)
e替換字符串作為表達(dá)式
m將待匹配串視為多行
o僅賦值一次
s將待匹配串視為單行
x忽略模式中的空白
注:e選項(xiàng)把替換部分的字符串看作表達(dá)式,在替換之前先計(jì)算其值,如:
$string="0abc1";
$string=~s/[a-zA-Z]+/$&x2/e;#now$string="0abcabc1"
4.2翻譯操作符
這是另一種替換方式,語(yǔ)法如:tr/string1/string2/。同樣,string2為替換部分,但其效果是把string1中的第一個(gè)字符替換為string2中的第一個(gè)字符,把string1中的第二個(gè)字符替換為string2中的第二個(gè)字符,依此類推。如:
$string="abcdefghicba";
$string=~tr/abc/def/;#nowstring="defdefghifed"
當(dāng)string1比string2長(zhǎng)時(shí),其多余字符替換為string2的最后一個(gè)字符;當(dāng)string1中同一個(gè)字符出現(xiàn)多次時(shí),將使用第一個(gè)替換字符。
翻譯操作符的選項(xiàng)如下:
c翻譯所有未指定字符
d刪除所有指定字符
s把多個(gè)相同的輸出字符縮成一個(gè)
如$string=~tr/\d//c;把所有非數(shù)字字符替換為空格?!鐂tring=~tr\t//d;刪除tab和空格;$string=~tr/0-9//cs;把數(shù)字間的其它字符替換為一個(gè)空格
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/yc0188/archive/2007/05/28/1628117.aspx
【編輯推薦】