我有网址列表。我需要从中剥离协议。 有些可能只有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";
}
它工作正常但是有更好的方法将它写在一行吗?
答案 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\.)?!!;
几点:
使用s!a!b!
代替s/a/b/
,这可以保存\/\/
转义。
使用^
,确保http://
位于字符串的开头
作为一条线:
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