Perl正则表达式 - 删除点分隔字符串的第一部分

时间:2018-06-06 15:28:19

标签: regex perl

我必须删除以点分隔的字符串的第一部分。如:

test.domain.com          --> domain.com
sub.domain.example.com   --> domain.example.com
bar.foo.bar.hoster.net   --> foo.bar.hoster.net

依旧......

如何在perl中执行此操作?

3 个答案:

答案 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