需要帮助在Perl中创建一个简单的正则表达式

时间:2011-09-28 18:32:37

标签: regex string perl replace

在创建正则表达式模式时,我仍然没用。这个必须非常简单。

给出字符串:/home/users/cheeseconqueso/perl.pl

我想将字符串./放在原始字符串中最后一个/的前面,以生成:/home/users/cheeseconqueso/./perl.pl

提前致谢 - 我确信这个简单的例子可以帮助我解决许多其他不应该出现的愚蠢内容!

7 个答案:

答案 0 :(得分:4)

my $variable = "/home/users/cheeseconqueso/perl.pl";

$variable =~ s/(.*\/)([^\/]+)$/$1\.\/$2/;

答案 1 :(得分:4)

这是我的解决方案,基于我在将评论留给您的问题时的想法:

use strict;
use warnings;

my $str = '/home/users/cheeseconqueso/perl.pl';
my @arr = split('/',$str);
my $newstr = join('/', @arr[0..(@arr-2)], '.', $arr[-1]);

编辑:如果你真的热衷于使用正则表达式,这是我发现的最简单的一个:

$str =~ s|(.*/)(.*)|$1./$2|;

利用第一组中初始*的贪婪将每个角色带到最后/,然后匹配第二组中的其他所有角色。使用|分隔符更容易阅读,这样可以避免倾斜牙签综合征。

答案 2 :(得分:3)

这是使用File :: Basename而不是正则表达式,如果你发现难以编写正则表达式,你可以使用这个cpan模块。

use File::Basename;
$path = '/home/users/cheeseconqueso/perl.pl';
$newpath = dirname($path) . './'.basename($path);

答案 3 :(得分:1)

您实际上不需要正则表达式,只需split字符串:

my $str='/home/users/cheeseconqueso/perl.pl';

#Array: ('','home','users','cheeseconqueso','perl.pl')
my @arr=split(/\//,$str); 

my $output=join('/',@arr[0..($#arr-2)]); # '/home/users/cheeseconqueso'
$output.='/./' . $arr[$#arr]; #Pops on the '/./' and the last element of @arr.

答案 4 :(得分:0)

s/(.*)\/(.*)/\1.\/\2/

正如CanSpice所指出的那样,拆分工作也很合适。

答案 5 :(得分:0)

试试这个:

my $str = "/home/users/cheeseconqueso/perl.pl";
if($str =~ /^(.*)(\/)(\w+\.\w+)$/) {
    $str = $1.'/.'.$2.$3;
}

答案 6 :(得分:0)

正则表达式?我们不需要stinkin'正则表达式。

l-value substr()来救援!

#!/usr/bin/perl
use warnings;
use strict;

$_ = "/home/users/cheeseconqueso/perl.pl\n";
substr($_, rindex($_, '/'), 0) = '/.';
print;