Sensethising域名

时间:2013-11-12 22:40:13

标签: regex perl

所以我试图将所有编号的域放在哈希的元素上,这样做:

### Domanis ###
my $dom = $name;
$dom =~ /(\w+\.\w+)$/; #this regex get the domain names only
my $temp = $1;

if ($temp =~ /(^d+\.\d+)/) { # this regex will take out the domains with number 
    my $foo = $1;
    $foo = "OTHER";
    $domain{$foo}++;
}
else {
    $domain{$temp}++;
}

其中$name类似于:

something.something.72.154
something.something.72.155
something.something.72.173
something.something.72.175
something.something.73.194
something.something.73.205
something.something.73.214
something.something.abbnebraska.com
something.something.cableone.net
something.something.com.br
something.something.cox.net
something.something.googlebot.com

我的代码目前打印出来:

72.175
73.194
73.205
73.214
abbnebraska.com
cableone.net
com.br
cox.net
googlebot.com
lstn.net

但是我希望它像这样打印:

abbnebraska.com
cableone.net
com.br
cox.net
googlebot.com
OTHER
lstn.net

其中OTHER是所有编号的域名,所以任何想法如何?

3 个答案:

答案 0 :(得分:0)

拿走目前的内容,然后使用正则表达式:

/\d+\.\d+/

如果匹配这个,那么它是一对数字,所以删除它。

通过这种方式,您可以将任何带有数字的单词保留在其中。

答案 1 :(得分:0)

你真的不需要将变量分成两部分,例如这个正则表达式将匹配您想要陷阱的情况: /\d{1,3}\.\d{1,3}$/ - 如果字符串以两个由点

分隔的1-3个长数字结尾,则返回true

但我的意思是,如果您只需要将那些未编号的域分开,您只需检查域中的最后一个字符是否为字母,因为TLD不能包含数字,因此您可以执行类似的操作 /\w$/ - 如果返回true,则它不是编号域(假设您已剥离空格和新行)

但是我认为在正则表达式中更具体一点是更好的,这也更好地说明了你在脚本中寻找的逻辑,所以我会使用前一个正则表达式。

实际上你可以这样做:

if (my ($domain) = $name =~ /\.(\w+.\w+)$/)
{
#the domain is assigned to the variable $domain
} else {
#it is a number domain
}

答案 2 :(得分:0)

请请正确缩进代码,并使用空格分隔出各种各样的零碎。这将使您的代码更容易阅读。

有趣的是,您提到您输出错误,但您发布的代码部分没有printprintfsay声明。看起来你正试图计算各种域名。

如果这些是$name的值,则有几个问题:

if ($temp =~ /(^d+\.\d+)/) {

什么都不匹配。这表示您的字符串以一个或多个字母d开头,后跟一个句点后跟一个或多个数字。 ^将正则表达式锚定到字符串的开头。

我想,但不是100%肯定,你想要这个:

if ( $temp =~ /\d\.\d/ ) {

这将找到两个数字之间存在句点的所有情况。这是/\d+\.\d+/的子模式,因此两个正则表达式都匹配相同的东西。

$dom =~ /(\w+\.\w+)$/;

匹配整个字符串$dom中的任意位置,其中有两个字母,数字。或者带有小数的下划线。这就是你想要的吗?

我也相信这可能表示某种错误:

my $foo = $1;
$foo = "OTHER";
$domain{$foo} ++;

这会将$foo设置为匹配的$dom,但会立即将$foo重置为OTHER,并递增$domain{OTHER}

我们需要您的初始数据样本,也许是打印输出的实际例程。