2011-06-03 48 views
2
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

/是forwardslash和\是反斜杠。 – Salgar 2011-06-03 22:37:57

回答

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

这是否甚至编译?即使将'〜='固定为'=〜',我也可以得到'替代替换没有终止',无可否认在Perl 5.8.8中。是否应该使用'{re1}(re2)'样式替代包围?如果是这样,当'a'紧跟在斜线后面时,是不是会丢弃最后一个斜线,并且它不会忽略其他地方的'a'? – 2011-06-03 23:57:41

+0

是的,我犯了一些错别字。 – 2011-06-04 00:57:53

2

如果有保证的只有一个“A”,那么保罗的答案就足够了,与一对夫妇的小变化:

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

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

如果可能有多个/“和‘.JPG’最终之间的”“事情只会变得稍微棘手:

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

基本上,同时还有”一间为最后的‘/’和'.jpg',一次换一个''一个。

0

这取代了第一“A”之间的最后“/”和“.JPG”与‘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 
0

这样替换的另一种方式(匹配的多次出现“一个“):

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 

输出:

​​