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