从路径中提取主机+一个文件夹

时间:2011-12-15 12:17:17

标签: regex perl hive

你能帮我找出一个从url中提取的正则表达式:

  1. 主机名,如果后面的路径中没有指定文件夹 例如

    http://jj.com/' -> 'jj.com
    http://jj.com/index.php' -> 'jj.com
    http://jj.com/query?q=http://kk.uk' -> 'jj.com
    
  2. 当路径中至少指定了一个文件夹时,主机名+路径中的一个文件夹 e.g。

    'http://jj.com/site/index.php' -> 'jj.com/site'
    'http://jj.com/site/second/aldldls.html' -> 'jj.com/site'
    
  3. 只用一个正则表达式可以做到吗?

    BTW我将使用来自hive的regex_extract函数,但任何可以做到这一点的正则表达式(例如perl regex)的变化都非常有用。

2 个答案:

答案 0 :(得分:2)

use 5.010;
use URI;

for (
    'http://jj.com/',
    'http://jj.com/index.php',
    'http://jj.com/query?q=http://kk.uk',
    'http://jj.com/site/index.php',
    'http://jj.com/site/second/aldldls.html',
) {
    my $u = URI->new($_);
    say (
        ($u->path_segments)[2]
            ? join q(/), $u->host, ($u->path_segments)[1]
            : $u->host
    );
}

输出

jj.com
jj.com
jj.com
jj.com/site
jj.com/site

答案 1 :(得分:1)

#!/usr/bin/perl

use strict;
use warnings;

for (<DATA>) {
    s!^http://([^/]+/([^\?/]+/)?).*!$1!;
    s!/\s*$!!;
    print "$_\n";
}

__DATA__
http://jj.com/
http://jj.com/index.php
http://jj.com/query?q=http://kk.uk
http://jj.com/site/index.php
http://jj.com/site/second/aldldls.html

输出:

jj.com
jj.com
jj.com
jj.com/site
jj.com/site