我必须删除以点分隔的字符串的第一部分。如:
test.domain.com --> domain.com
sub.domain.example.com --> domain.example.com
bar.foo.bar.hoster.net --> foo.bar.hoster.net
依旧......
如何在perl中执行此操作?
答案 0 :(得分:1)
最简单的方法是使用这样的替换:
$str =~ s/^[^.]*\.//;
正则表达式意味着:
^
- 字符串的开头[^.]*
- 0个或更多不是.
\.
- 一个文字点没有必要捕获字符串的其余部分只是为了替换它。
此代码假定如果字符串中没有点,则您希望保持不变。
但是,如果您希望"foo"
变成""
,则只需要\.
可选:
$str =~ s/^[^.]*\.?//;
答案 1 :(得分:1)
非正则表达式*解决方案可能更明显:
use strict;
use warnings;
use 5.010;
my @tests = (
'test.domain.com',
'sub.domain.example.com',
'bar.foo.bar.hoster.net',
);
for my $t (@tests) {
(undef, my @parts) = split(/\./, $t);
say join('.', @parts);
}
或者:
for my $t (@tests) {
my $i;
say join('.', grep { ++$i > 1 } split(/\./, $t));
}
*嗯,主要是非正则表达式,无论如何。 split
的第一个参数是一个模式,但我们只是匹配一个文字点。
答案 2 :(得分:0)
这应该可以解决问题:
use strict;
use warnings;
my @domains = ("test.domain.com", "abc.sub.example.com");
foreach my $value (@domains) {
$value =~ s/[^.]+.(.*)/$1/;
print $value . "\n";
}
我喜欢使用负字符类[^。] +(不是点)来做一个。?使用。?似乎让我经常遇到麻烦,当角色类正在做真正被问到的事情时,直到第一个非点。
输出:
domain.com
sub.example.com