首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

Perl 正则表达式 取值,该如何解决

2012-04-15 
Perl 正则表达式 取值各位高手,小弟有个问题,请教大家Perl code$_123.zip 234.zip 345.zip 987456if(/

Perl 正则表达式 取值
各位高手,小弟有个问题,请教大家

Perl code
$_="123.zip 234.zip 345.zip 987456";if(/(.*.zip)/){  print $1;  print $2;  print $3;}
为什么$1有值,而$2和$3都没有值呢?
望有经验的不吝赐教
感谢感谢

[解决办法]
Perl code
my $str="123.zip 234.zip 345.zip 987456";while($str=~/(\d+\.zip)/g){    print("$1\n");}if($str=~/(\d+\.zip)\s+(\d+\.zip)\s+(\d+\.zip)/){    print("$1\n");    print("$2\n");    print("$3\n");}
[解决办法]
因为只有一对括弧,所以只有$1进行了匹配
[解决办法]
123.zip中的点号需要转义
Perl code
$_="123.zip 234.zip 345.zip 987456";@t=$_=~/(\d+\.zip)/g;print "@t\n";
[解决办法]
问题很多:
1. 不要使用$_做自己的变量名。
2. .*是贪婪匹配,会匹配整个"123.zip 234.zip 345"
3. .zip的.需要转义
4. $1是取正则表达式第一个括号的匹配内容,$2是第二个括号,$3是第三个括号。你的表达式里只有一个括号当然无法匹配。
5. 正则表达式默认是只匹配一次的。
6. 注意你代码里的空白。在适当的地方加入空格和缩进,否则看起来不舒服。
7. 取整个匹配用$&就可以,不需要加那么一对大括号。

Perl code
my $s = "123.zip 234.zip 345.zip 987456";my @all = $s =~ /\S+\.zip/g; 

热点排行