2.5任意符号.,和次数符号*以及+
Perl正则表达式里点号是通配任意字母的,例如
$string=~/w.*/i;
就匹配$string里从第一个w字母开始一直到字符串结束。*表示匹配任意字母0到任意多次。*号也常被换成+号,表示匹配1到任意多次。如果即没有*也没有+,那么就是匹配1次。如果要自己定义匹配的次数或者次数上下限怎么办?用{}符号:
$string=~/\d{5,15}/;
上面的式子匹配5到15位数字
$string=~/\d{20}/;
上面的式子匹配20位数字。
附带说两个常用的符号,\S和\s。前者是"非空白",后者是"空白",具体来说包括回车、空格、跳格、响铃。
2.6贪婪的+和*,止贪剂?
Perl的Perl正则表达式是贪婪的(确切地说,次数符号+和*是贪婪的),可以帮助你做一些事情。
my$string='$290098';
$string=~/\$(\d+)/;
由于+号的贪婪性,$1会得到值"290098",而不是遇到第一个数字2就完成匹配。
但有的时候你会不希望他贪婪,希望见好就收。还是我前面用过的一个例子
my$string="Applejuice,appleCider,applejeans,applepie,appleplate,apPLebag,…";
如果用$string=~/(apple.*),/i;
由于*的贪婪性,它会一直匹配到最后一个逗号才停下来,这不是我们想要的结果。解决办法是用止贪符号?紧跟在*或者+后面。
$string=~/(apple.*?),/i;
问号会约束*遇到第一个逗号就停下来。
2.6头锚^和尾锚$
有时候你希望从一个字符串的开始或者结尾匹配
my$string='Aquickbrownfoxjumpsoveralazysnake';
$string=~/^A/;#匹配第一个字母是否为A
$string=~/snake$/;#匹配最后几个字母是否为snake
还有一个\b,匹配的是单词边界,意思是空白或者开头或者结尾。
3.其它相关函数及注意事项
3.1替换功能和quotemeta
有时候你不仅希望找到你想要那些字符串,还想替换掉它们。还记得前面说的匹配符后面的m符号么?现在是使用另一个,s符号(替换,subplace)的时候了。
$string=~s/apple/apple/i;
上面表达式将$string里所有不用形式的apple统一成全小写的apple.这里面可以用变量:
$string=~s/$string1/$string2/i;
$string里所有匹配$string1的地方都会被替换成$string2。但是,要注意,除非你能确保$string1里面不含任何特殊符号(+-*^$.()[]等)或者你需要的就是那些符号,最好在调用上面式子之前处理一下$string1
$string1=quotemeta($string1);
quotemeta()的作用是给字符串里的特殊符号加上合适的转义符号。注意,不需要给$string2做这个处理。
联系客服