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'放在哪里。
答案 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