Заменить символ между слешами - PullRequest
2 голосов
/ 04 июня 2011
http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/####_####_####_###_####_a.jpg
http://photos-c.ak.fbcdn.net/hphotos-ak-ash4/wefawf/vawvaw/a####_####_####_###_####.jpg

Я пытаюсь создать регулярное выражение, которое заменяет 'a' между последними '/' и '.jpg' на 'n'.

Я совершенно потерян, верносейчас.Я использую Perl, и насколько я понимаю, он должен выглядеть следующим образом:

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

... за исключением того, что я не уверен, где поставить 'a'.

Ответы [ 4 ]

2 голосов
/ 04 июня 2011

Если гарантировано только одно «а», то ответа Павла будет достаточно, с парой небольших изменений:

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

Во-первых, у меня нет «/» перед «а». Достаточно указать, что между «a» и «.jpg» нет символов «/», и это учитывает оба ваших примера (при наличии «/» оно соответствует только второму из ваших примеров). Я также удалил модификатор '/ g' и добавил '\ Z', чтобы привязать регулярное выражение к концу строки. Нам нужен только последний матч.

Если между последним '/' и '.jpg может быть несколько символов' a ', все становится немного сложнее:

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

По сути, хотя между последним '/' и '.jpg все еще есть' а ', продолжайте менять' а 'на' н 'по одному.

2 голосов
/ 04 июня 2011
$foo =~ s?/a([^/]*.jpg)?/n$1?g;
0 голосов
/ 04 июня 2011

Другой способ выполнить эту замену (сопоставить несколько вхождений "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
0 голосов
/ 04 июня 2011

Заменяет первое «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...