为什么替换正则表达式失败了?

时间:2014-02-22 18:33:09

标签: regex perl

这些片段似乎与我相同:

$ perl -E '  
my $var="/usr/local/bin/gcc";  
$var =~ s/([^\/]*)$/$1/;  
print "$var\n";'  
/usr/local/bin/gcc  

$ perl -E '  
my $var="/usr/local/bin/gcc";  
$var =~ /([^\/]*)$/;   
print "$1\n";'  
gcc  

然而,代码段1中的替换不起作用。它打印/usr/local/bin/gcc而不是gcc,而$1正确,因为第二个代码段证明了。
这有什么问题?

3 个答案:

答案 0 :(得分:2)

您对等效的期望有些不对。与第二个例子相当的是:

$ perl -E '
my $var="/usr/local/bin/gcc";
$var =~ s/.*?([^\/]*)$/$1/;
print "$var\n";'
gcc

您正在做的只是捕获组中的模式,并用自己替换这样捕获的组。如果你尝试用什么来代替比赛,那就显而易见了:

$ perl -E '
my $var="/usr/local/bin/gcc";
$var =~ s/([^\/]*)$//;
print "$var\n";'
/usr/local/bin/

答案 1 :(得分:1)

您的替换是在字符串末尾找到与[^\/]*匹配的文本,并将其替换为匹配的文本(即它是一个标识操作)。

第二个例子只输出匹配的文本,忽略字符串开头不匹配的文本。

如果您希望第一个示例执行与第二个示例相同的操作,则应尝试将模式修改为:s/^.*?([^\/]*)$/$1/

答案 2 :(得分:0)

为您的特殊应用提供更便携的解决方案。使用核心模块来操作文件路径总是一个好主意。所以我建议如下

$ perl -MFile::Basename -E '
my $var="/usr/local/bin/gcc";
print scalar fileparse($var), "\n";'
gcc