Найти и заменить любой или оба шаблона в строке - PullRequest
1 голос
/ 06 января 2012

У меня есть список URL.Мне нужно снять протокол с него.У некоторых может быть только http: //, у некоторых может быть www или у обоих оба.

Я написал код для него как:

my @list = qw'http://de.yahoo.com http://mail.example.org http://www.aol.com';
foreach(@list)
{
  my $string = $_;
  $string =~ s/http:\/\///;
  $string =~ s/www.//;
  print $string,"\n";
}

Работает нормально, но естьлучший способ написать это в одну строку?

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Это должно сработать:

my @list = qw(http://de.yahoo.com http://mail.example.org http://www.aol.com);
foreach(@list)
{
  my $string = $_;
  $string =~ s/^(?:http:\/\/)?(?:www\.)?//;
  print $string,"\n";
}

Для дальнейшего использования http://www.regextester.com/ ваш друг:)

** Редактировать ** Модифицировано для использования предложения ikegami (?: ...), так как оно должно быть более эффективным, когда захваченные значения не нужны.

0 голосов
/ 06 января 2012

Да

s{http://(.*)www.|www.(.*)http://|http://|www.}{$1$2}g;

Но вы, вероятно, хотели сделать:

s{^http://}[};
s{^www\.}[};

, которые можно объединить в:

s{^(?:http://)?(?:www\.)?}{};

http://www.foo.bar/www.html?http://xxx  =>  foo.bar/www.html?http://xxx
http://foo.bar/www.html                 =>  foo.bar/www.html?http://xxx
www.foo.bar/www.html                    =>  foo.bar/www.html?http://xxx
foo.bar/www.html                        =>  foo.bar/www.html?http://xxx
0 голосов
/ 06 января 2012

Я думаю, вы можете захотеть:

s!^(http://)?(www\.)?!!;

Несколько баллов:

  1. использовать s!a!b! вместо s/a/b/, это сохранит \/\/escape.

  2. используйте ^, это гарантирует, что http:// находится в начале строки

Как одна строка:

print join("\n", map {s!^(http://)?(www\.)?!!;} @list);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...