錨 | 描述 |
^ 或 /A | 僅匹配串首 |
$ 或 /Z | 僅匹配串尾 |
/b | 匹配單詞邊界 |
/B | 單詞內(nèi)部匹配 |
例1:/^def/只匹配以def打頭的字符串,/$def/只匹配以def結(jié)尾的字符串,結(jié)合起來的/^def$/只匹配字符串def(?)。/A和/Z在多行匹配時與^和$不同。
例2:檢驗變量名的類型:
if ($varname =~ /^/$[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal scalar variable/n");
} elsif ($varname =~ /^@[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal array variable/n");
} elsif ($varname =~ /^[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal file variable/n");
} else {
print ("I don't understand what $varname is./n");
}
例3:/b在單詞邊界匹配://bdef/匹配def和defghi等以def打頭的單詞,但不匹配abcdef。/def/b/匹配def和abcdef等以def結(jié)尾的單詞,但不匹配defghi,//bdef/b/只匹配字符串def。注意://bdef/可匹配$defghi,因為$并不被看作是單詞的部分。
例4:/B在單詞內(nèi)部匹配://Bdef/匹配abcdef等,但不匹配def;/def/B/匹配defghi等;//Bdef/B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。
7、模式中的變量替換
將句子分成單詞:
$pattern = "[//t ]+";
@words = split(/$pattern/, $line);
8、字符范圍轉(zhuǎn)義
E 轉(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] |
例:/[/da-z]/匹配任意數(shù)字或小寫字母。
9、匹配任意字符
字符"."匹配除換行外的所有字符,通常與*合用。
10、匹配指定數(shù)目的字符
字符對{}指定所匹配字符的出現(xiàn)次數(shù)。如:/de{1,3}f/匹配def,deef和deeef;/de{3}f/匹配deeef;/de{3,}f/匹配不少于3個e在d和f之間;/de{0,3}f/匹配不多于3個e在d和f之間。
11、指定選項
字符"|"指定兩個或多個選擇來匹配模式。如:/def|ghi/匹配def或ghi。
例:檢驗數(shù)字表示合法性
if ($number =~ /^-?/d+$|^-?0[xX][/da-fa-F]+$/) {
print ("$number is a legal integer./n");
} else {
print ("$number is not a legal integer./n");
}
其中 ^-?/d+$ 匹配十進制數(shù)字,^-?0[xX][/da-fa-F]+$ 匹配十六進制數(shù)字。
12、模式的部分重用
當模式中匹配相同的部分出現(xiàn)多次時,可用括號括起來,用/n來多次引用,以簡化表達式:
//d{2}([/W])/d{2}/1/d{2}/ 匹配:
12-05-92
26.11.87
07 04 92等
注意://d{2}([/W])/d{2}/1/d{2}/ 不同于/(/d{2})([/W])/1/2/1/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。
13、轉(zhuǎn)義和特定字符的執(zhí)行次序
象操作符一樣,轉(zhuǎn)義和特定字符也有執(zhí)行次序:
特殊字符 | 描述 |
() | 模式內(nèi)存 |
+ * ? {} | 出現(xiàn)次數(shù) |
^ $ /b /B | 錨 |
| | 選項 |
選項 | 描述 |
g | 匹配所有可能的模式 |
i | 忽略大小寫 |
m | 將串視為多行 |
o | 只賦值一次 |
s | 將串視為單行 |
x | 忽略模式中的空白 |
選項 | 描述 |
g | 改變模式中的所有匹配 |
i | 忽略模式中的大小寫 |
e | 替換字符串作為表達式 |
m | 將待匹配串視為多行 |
o | 僅賦值一次 |
s | 將待匹配串視為單行 |
x | 忽略模式中的空白 |
注:e選項把替換部分的字符串看作表達式,在替換之前先計算其值,如:
$string = "0abc1";
$string =~ s/[a-zA-Z]+/$& x 2/e; # now $string = "0abcabc1"
六、翻譯操作符
這是另一種替換方式,語法如:tr/string1/string2/。同樣,string2為替換部分,但其效果是把string1中的第一個字符替換為string2中的第一個字符,把string1中的第二個字符替換為string2中的第二個字符,依此類推。如:
$string = "abcdefghicba";
$string =~ tr/abc/def/; # now string = "defdefghifed"
當string1比string2長時,其多余字符替換為string2的最后一個字符;當string1中同一個字符出現(xiàn)多次時,將使用第一個替換字符。
翻譯操作符的選項如下:
選項 | 描述 |
c | 翻譯所有未指定字符 |
d | 刪除所有指定字符 |
s | 把多個相同的輸出字符縮成一個 |
如$string =~ tr//d/ /c;把所有非數(shù)字字符替換為空格。$string =~ tr//t //d;刪除tab和空格; $string =~ tr/0-9/ /cs;把數(shù)字間的其它字符替換為一個空格。
七、擴展模式匹配
PERL支持PERL4和標準UNIX模式匹配操作所沒有的一些模式匹配能力。其語法為:(?<c>pattern),其中c是一個字符,pattern是起作用的模式或子模式。
1、不存貯括號內(nèi)的匹配內(nèi)容
在PERL的模式中,括號內(nèi)的子模式將存貯在內(nèi)存中,此功能即取消存貯該括號內(nèi)的匹配內(nèi)容,如/(?:a|b|c)(d|e)f/1/中的/1表示已匹配的d或e,而不是a或b或c。
2、內(nèi)嵌模式選項
通常模式選項置于其后,有四個選項:i、m、s、x可以內(nèi)嵌使用,語法為:/(?option)pattern/,等價于/pattern/option。
3、肯定的和否定的預(yù)見匹配
肯定的預(yù)見匹配語法為/pattern(?=string)/,其意義為匹配后面為string的模式,相反的,(?!string)意義為匹配后面非string的模式,如:
$string = "25abc8";
$string =~ /abc(?=[0-9])/;
$matched = $&; # $&為已匹配的模式,此處為abc,而不是abc8
4、模式注釋
PERL5中可以在模式中用?#來加注釋,如:
if ($string =~ /(?i)[a-z]{2,3}(?# match two or three alphabetic characters)/ {
...
}
新聞熱點
疑難解答