Regex 在斜杠之间替换字符

Regex 在斜杠之间替换字符,regex,perl,Regex,Perl,。。。除了我不确定把“a”放在哪里。如果保证只有一个“a”,那么保罗的回答就足够了,只需做几个小改动: s/^.*\/.*$/n/g $foo =~ s?/a([^/]*.jpg)?/n$1?g; 首先,我在“a”前面没有“/”。指定“a”和“.jpg”之间没有“/”就足够了,这允许两个示例都使用“/”(使用“/”表示只匹配第二个示例)。我还删除了'/g'修饰符并添加了'\Z'以将正则表达式锚定到字符串的末尾。我们只需要最后一场比赛 如果在最后一个“/”和“.jpg”之间可能有多个“a”,那

。。。除了我不确定把“a”放在哪里。

如果保证只有一个“a”,那么保罗的回答就足够了,只需做几个小改动:

s/^.*\/.*$/n/g
$foo =~ s?/a([^/]*.jpg)?/n$1?g;
首先,我在“a”前面没有“/”。指定“a”和“.jpg”之间没有“/”就足够了,这允许两个示例都使用“/”(使用“/”表示只匹配第二个示例)。我还删除了'/g'修饰符并添加了'\Z'以将正则表达式锚定到字符串的末尾。我们只需要最后一场比赛

如果在最后一个“/”和“.jpg”之间可能有多个“a”,那么事情只会稍微复杂一些:

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

基本上,虽然在最后的“/”和“.jpg”之间仍然有“a”,但请保持每次用“a”替换“n”。

这将用“n”(已测试)替换最后的“/”和“.jpg”之间的第一个“a”:


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


/是正斜杠,\是反斜杠。这会编译吗?即使将
~=
修复为
=~
,我也会得到“替换未终止
”,这是Perl 5.8.8的一个例子。它应该使用
s{re1}(re2)`样式的可选括号吗?如果是这样的话,当
a
紧跟在斜杠之后时,它不是会删除最后一个斜杠吗?它不会忽略
a
其他任何地方吗?
$foo =~ s|a([^/]*\.jpg)\Z|n$1|;
while ($foo =~ s|(/[^/]*)a([^/]*\.jpg\Z)|$1n$2|) { }
$ 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
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