查找并替换字符串中的任何或两个模式

时间:2012-01-06 01:31:38

标签: regex perl

我有网址列表。我需要从中剥离协议。 有些可能只有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 个答案:

答案 0 :(得分:3)

这应该可以解决问题:

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的建议(?:...),因为当不需要捕获的值时它应该更有效。

答案 1 :(得分:0)

我想你可能想要:

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

几点:

  1. 使用s!a!b!代替s/a/b/,这可以保存\/\/转义。

  2. 使用^,确保http://位于字符串的开头

  3. 作为一条线:

    print join("\n", map {s!^(http://)?(www\.)?!!;} @list);
    

答案 2 :(得分:0)

是:

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