无法使用Perl正则表达式删除包含反斜杠的Windows目录路径

时间:2014-10-23 15:23:58

标签: regex perl substitution backslash

我想在perl中使用正则表达式删除文件的完整路径的第一部分。但是在路径中使用反斜杠时它不起作用。考虑下面的test.pl

$fileName = 'C:\someDirectory\anotherDirectory\someFile.txt';
$dirName  = 'C:\someDirectory';

print "$fileName\n";

$fileName =~ s/$dirName//;

print "$fileName\n";


$fileName = 'C:#someDirectory#anotherDirectory#someFile.txt';
$dirName  = 'C:#someDirectory';

print "$fileName\n";

$fileName =~ s/$dirName//;

print "$fileName\n";

输出如下:

C:\someDirectory\anotherDirectory\someFile.txt
C:\someDirectory\anotherDirectory\someFile.txt
C:#someDirectory#anotherDirectory#someFile.txt
#anotherDirectory#someFile.txt

为什么反斜杠在字符串中时替换不起作用?我怎么能绕过这个?

1 个答案:

答案 0 :(得分:1)

正则表达式中的文字字符串

反斜杠是一个正则表达式特殊字符,因此如果它打算作为正则表达式中文字字符串的一部分,则必须对其进行转义。

为此,您只需使用quotemeta\Q...\E转义序列:

my $fileName = 'C:\someDirectory\anotherDirectory\someFile.txt';
my $dirName  = 'C:\someDirectory';

print "$fileName\n";

$fileName =~ s/\Q$dirName\E//;

print "$fileName\n";

输出:

C:\someDirectory\anotherDirectory\someFile.txt
\anotherDirectory\someFile.txt

Path :: Class for File& Dir Manipulation

或者,您可以使用Path::Class之类的模块进行跨平台兼容的文件和目录操作。

以下是您执行的相同目标:

use Path::Class;

my $file = file('C:\someDirectory\anotherDirectory\someFile.txt');
my $dir  = dir('C:\someDirectory');

my $rel = $file->relative($dir);

print "$rel\n";

输出:

anotherDirectory\someFile.txt