替换斜杠之间的字符

时间:2011-06-03 22:32:40

标签: regex perl

http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/####_####_####_###_####_a.jpg
http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/wefawf/vawvaw/a####_####_####_###_####.jpg

我正在尝试创建一个正则表达式,用'n'替换最后'/'和'.jpg'之间的'a'。

我现在完全迷失了。我正在使用Perl,根据我的理解,它应该是这样的:

s/^.*\/.*$/n/g

...除了我不确定把'a'放在哪里。

4 个答案:

答案 0 :(得分:2)

$foo =~ s?/a([^/]*.jpg)?/n$1?g;

答案 1 :(得分:2)

如果只保证一个'a',那么保罗的答案就足够了,只需要做一些小改动:

$foo =~ s|a([^/]*\.jpg)\Z|n$1|;

首先,我在'a'之前没有'/'。只需指定'a'和'.jpg'之间没有'/'就足够了,并且允许你的两个例子('/'表示只与你的第二个例子匹配)。我还删除了'/ g'修饰符并添加了'\ Z'来将正则表达式锚定到字符串的末尾。我们只需要最后一场比赛。

如果最终'/'和'.jpg'之间可能存在多个'a',那么事情会变得有点棘手:

while ($foo =~ s|(/[^/]*)a([^/]*\.jpg\Z)|$1n$2|) { }

基本上,虽然最终'/'和'.jpg'之间仍然存在'a',但要一次交换'a'代表'n'。

答案 2 :(得分:0)

这将'/'和'.jpg'之间的第一个'a'替换为'n'(已测试):

$ cat test.pl 
#!/usr/bin/env perl

use strict;
use warnings;

sub a_with_n {
    shift;
    s!(.*/.*)a(.*\.jpg)!$1n$2!;
    return $_;
}

my @test_strings = (
    'http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/####_####_####_###_####_a.jpg',
    'http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/wefawf/vawvaw/a####_####_####_###_####.jpg'
);

foreach (@test_strings) {
    printf("%s\n", a_with_n($_));
}


$ ./test.pl 
http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/####_####_####_###_####_n.jpg
http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/wefawf/vawvaw/n####_####_####_###_####.jpg

答案 3 :(得分:0)

进行此替换的另一种方法(匹配多次出现的“a”):

use strict;
use warnings;

while (<DATA>) {
    my $last = rindex ($_, "/");    # get index of last "/"
    substr ($_,$last) =~ s/a/n/g;   # change all "a" to "n" starting from last "/"
    print;
  }

__DATA__
http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/####_####_####_###_###a#_aa.jpg
http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/wefawf/vawvaw/a####_####_####_###_####.jpg

输出:

http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/####_####_####_###_###n#_nn.jpg
http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/wefawf/vawvaw/n####_####_####_###_####.jpg