📄 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 + -