如何使用正则表达式替换部分字符串?

时间:2009-05-13 09:28:40

标签: regex perl string replace

HI,
我有一个看起来像

的字符串
/dir/dir1/filename.txt

我想用其他名称替换“filename.txt”,使“/ dir / dir1”保持不变 所以在替换后,字符串看起来像

/dir/dir1/newfilename.txt

考虑到我不知道“filename”的值,我如何在Perl中使用RegExp呢?

非常感谢

P.S:“filename.txt”和“newfilename.txt”用于在询问原始文件名不同的问题时使事情变得简单。

4 个答案:

答案 0 :(得分:11)

我建议不要使用正则表达式来摆弄文件名/路径。目录分隔符,有效/无效字符因平台而异,可能是一个需要解决的问题。我建议你尝试File::Spec提取文件名,然后用你想要的任何内容替换它

答案 1 :(得分:10)

正则表达式是您的问题的错误工具。正则表达式很棒,大部分时间都可以使用,但并不总是最干净(可读性)或最快的解决方案。

我建议使用经典的File::Basename。与File :: Spec相比,File :: Basename是一个核心模块(无需安装!)并且非常易于使用:

    use File::Basename;

    my $basename = basename($fullname,@suffixlist);
    my $dirname  = dirname($fullname);

我最喜欢的用途:

    my $filename = basename($path);

答案 2 :(得分:7)

$filename =~ s%/[^/]*$%/newfilename.txt%;
  • s%...%...% - 使用%作为分隔符,因此您可以在模式中使用/
  • / - 匹配斜杠
  • [^/]* - 以及任何不包含斜杠的字符串
  • $ - 直到字符串
  • 的结尾

答案 3 :(得分:1)

尝试这样的事情......

#!/usr/bin/perl

use strict;

my $string = "/dir/dir1/filename.txt";
my @string = split /\//, $string;
$string[-1] = "newfilename.txt";
print join "/", @string;