?? perl6.htm
字號:
注意:/\d{2}([\W])\d{2}\1\d{2}/
不同于/(\d{2})([\W])\1\2\1/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。<br>
<a name="13、轉義和特定字符的執行次序">
13、轉義和特定字符的執行次序</a>
<br>
象操作符一樣,轉義和特定字符也有執行次序:<br>
</p>
<table border="1" width="50%">
<tr>
<td valign="top" width="157"> 特殊字符</td>
<td valign="top" width="198"> 描述</td>
</tr>
<tr>
<td valign="top" width="157"> <tt>()</tt></td>
<td valign="top" width="198"> 模式內存</td>
</tr>
<tr>
<td valign="top" width="157"> <tt>+
* ? {}</tt></td>
<td valign="top" width="198"> 出現次數</td>
</tr>
<tr>
<td valign="top" width="157"> <tt>^
$ \b \B</tt></td>
<td valign="top" width="198"> 錨</td>
</tr>
<tr>
<td valign="top" width="157"> <tt>|</tt></td>
<td valign="top" width="198"> 選項</td>
</tr>
</table>
<br><a name="14、指定模式定界符">14、指定模式定界符</a>
<br>
缺省的,模式定界符為反斜線/,但其可用字母m自行指定,如:<br>
m!/u/jqpublic/perl/prog1!
等價于/\/u\/jqpublic\/perl\/prog1/<br>
注:當用字母'作為定界符時,不做變量替換;當用特殊字符作為定界符時,其轉義功能或特殊功能即不能使用。<br>
<a name="15、模式次序變量">15、模式次序變量</a>
<br>
在模式匹配后調用重用部分的結果可用變量$n,全部的結果用變量$&。<br>
$string =
"This string contains the number 25.11.";<br>
$string =~
/-?(\d+)\.?(\d+)/; # 匹配結果為25.11<br>
$integerpart
= $1; # now $integerpart = 25<br>
$decimalpart
= $2; # now $decimalpart = 11<br>
$totalpart =
$&; # now totalpart = 25.11<br>
<a name="四、模式匹配選項">四、模式匹配選項</a>
<br>
</p>
<table border="1" width="50%">
<tr>
<td valign="top" width="144"> 選項</td>
<td valign="top" width="288"> 描述</td>
</tr>
<tr>
<td valign="top" width="144"> <tt>g</tt></td>
<td valign="top" width="288"> 匹配所有可能的模式</td>
</tr>
<tr>
<td valign="top" width="144"> <tt>i</tt></td>
<td valign="top" width="288"> 忽略大小寫</td>
</tr>
<tr>
<td valign="top" width="144"> <tt>m</tt></td>
<td valign="top" width="288"> 將串視為多行</td>
</tr>
<tr>
<td valign="top" width="144"> <tt>o</tt></td>
<td valign="top" width="288"> 只賦值一次</td>
</tr>
<tr>
<td valign="top" width="144"> <tt>s</tt></td>
<td valign="top" width="288"> 將串視為單行</td>
</tr>
<tr>
<td valign="top" width="144"> <tt>x</tt></td>
<td valign="top" width="288"> 忽略模式中的空白</td>
</tr>
</table>
<br><a name="1、匹配所有可能的模式(g選項)">
1、匹配所有可能的模式(g選項)</a>
<br>
@matches =
"balata" =~ /.a/g; # now @matches = ("ba",
"la", "ta")<br>
匹配的循環:<br>
while
("balata" =~ /.a/g) {<br>
$match =
$&;<br>
print
("$match\n");<br>
}<br>
結果為:<br>
ba<br>
la<br>
ta<br>
當使用了選項g時,可用函數pos來控制下次匹配的偏移:<br>
$offset =
pos($string);<br>
pos($string)
= $newoffset;<br>
<a name="2、忽略大小寫(i選項)例">
2、忽略大小寫(i選項)例</a>
<br>
/de/i 匹配de,dE,De和DE。<br>
<a name="3、將字符串看作多行(m選項)">
3、將字符串看作多行(m選項)</a>
<br>
在此情況下,^符號匹配字符串的起始或新的一行的起始;$符號匹配任意行的末尾。<br>
<a name="4、只執行一次變量替換例">
4、只執行一次變量替換例</a>
<br>
$var = 1;<br>
$line = <STDIN>;<br>
while ($var < 10) { <br>
$result =
$line =~ /$var/o;<br>
$line =
<STDIN>; <br>
$var++;<br>
}<br>
每次均匹配/1/。<br>
<a name="5、將字符串看作單行例">
5、將字符串看作單行例</a>
<br>
/a.*bc/s匹配字符串axxxxx
\nxxxxbc,但/a.*bc/則不匹配該字符串。<br>
<a name="6、在模式中忽略空格">
6、在模式中忽略空格</a>
<br>
/\d{2} ([\W]) \d{2} \1
\d{2}/x等價于/\d{2}([\W])\d{2}\1\d{2}/。<br>
<a name="五、替換操作符">五、替換操作符</a>
<br>
語法為s/pattern/replacement/,其效果為將字符串中與pattern匹配的部分換成replacement。如:<br>
$string =
"abc123def";<br>
$string =~
s/123/456/; # now $string = "abc456def";<br>
在替換部分可使用模式次序變量$n,如s/(\d+)/[$1]/,但在替換部分不支持模式的特殊字符,如{},*,+等,如s/abc/[def]/將把abc替換為[def]。<br>
替換操作符的選項如下表:<br>
</p>
<table border="1" width="60%">
<tr>
<td valign="top" width="91"> 選項</td>
<td valign="top" width="499"> 描述</td>
</tr>
<tr>
<td valign="top" width="91"> <tt>g</tt></td>
<td valign="top" width="499"> 改變模式中的所有匹配</td>
</tr>
<tr>
<td valign="top" width="91"> <tt>i</tt></td>
<td valign="top" width="499"> 忽略模式中的大小寫</td>
</tr>
<tr>
<td valign="top" width="91"> <tt>e</tt></td>
<td valign="top" width="499"> 替換字符串作為表達式</td>
</tr>
<tr>
<td valign="top" width="91"> <tt>m</tt></td>
<td valign="top" width="499"> 將待匹配串視為多行</td>
</tr>
<tr>
<td valign="top" width="91"> <tt>o</tt></td>
<td valign="top" width="499"> 僅賦值一次</td>
</tr>
<tr>
<td valign="top" width="91"> <tt>s</tt></td>
<td valign="top" width="499"> 將待匹配串視為單行</td>
</tr>
<tr>
<td valign="top" width="91"> <tt>x</tt></td>
<td valign="top" width="499"> 忽略模式中的空白</td>
</tr>
</table>
<p> 注:e選項把替換部分的字符串看作表達式,在替換之前先計算其值,如:<br>
$string =
"0abc1";<br>
$string =~
s/[a-zA-Z]+/$& x 2/e; # now $string = "0abcabc1"<br>
<a name="六、翻譯操作符">六、翻譯操作符</a>
<br>
這是另一種替換方式,語法如:tr/string1/string2/。同樣,string2為替換部分,但其效果是把string1中的第一個字符替換為string2中的第一個字符,把string1中的第二個字符替換為string2中的第二個字符,依此類推。如:<br>
$string =
"abcdefghicba";<br>
$string =~
tr/abc/def/; # now string = "defdefghifed"<br>
當string1比string2長時,其多余字符替換為string2的最后一個字符;當string1中同一個字符出現多次時,將使用第一個替換字符。<br>
翻譯操作符的選項如下:<br>
</p>
<table border="1" width="80%">
<tr>
<td valign="top" width="69"> 選項</td>
<td valign="top" width="447"> 描述</td>
</tr>
<tr>
<td valign="top" width="69"> <tt>c</tt></td>
<td valign="top" width="447"> 翻譯所有未指定字符</td>
</tr>
<tr>
<td valign="top" width="69"> <tt>d</tt></td>
<td valign="top" width="447"> 刪除所有指定字符</td>
</tr>
<tr>
<td valign="top" width="69"> <tt>s</tt></td>
<td valign="top" width="447"> 把多個相同的輸出字符縮成一個</td>
</tr>
</table>
<p> 如$string =~ tr/\d/ /c;把所有非數字字符替換為空格。$string
=~ tr/\t //d;刪除tab和空格;
$string =~ tr/0-9/ /cs;把數字間的其它字符替換為一個空格。<br>
<br>
<a name="七、擴展模式匹配">七、擴展模式匹配
</a><br>
PERL支持PERL4和標準UNIX模式匹配操作所沒有的一些模式匹配能力。其語法為:(?<c>pattern),其中c是一個字符,pattern是起作用的模式或子模式。<br>
<a name="1、不存貯括號內的匹配內容">
1、不存貯括號內的匹配內容</a>
<br>
在PERL的模式中,括號內的子模式將存貯在內存中,此功能即取消存貯該括號內的匹配內容,如/(?:a|b|c)(d|e)f\1/中的\1表示已匹配的d或e,而不是a或b或c。<br>
<a name="2、內嵌模式選項">2、內嵌模式選項</a>
<br>
通常模式選項置于其后,有四個選項:i、m、s、x可以內嵌使用,語法為:/(?option)pattern/,等價于/pattern/option。<br>
<a name="3、肯定的和否定的預見匹配">
3、肯定的和否定的預見匹配<br>
</a> 肯定的預見匹配語法為/pattern(?=string)/,其意義為匹配后面為string的模式,相反的,(?!string)意義為匹配后面非string的模式,如:<br>
$string =
"25abc8";<br>
$string =~
/abc(?=[0-9])/; <br>
$matched =
$&; # $&為已匹配的模式,此處為abc,而不是abc8<br>
<a name="4、模式注釋">4、模式注釋</a>
<br>
PERL5中可以在模式中用?#來加注釋,如:<br>
if ($string
=~ /(?i)[a-z]{2,3}(?# match two or three alphabetic characters)/
{<br>
...<br>
}<br>
<br>
</p>
<p align="center"><a href="perl5.htm">上一章</a> <a href="perl7.htm">下一章</a> <a href="index.htm">目錄</a></p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -