使用RegEx&amp ;;解析根域预定的TLD列表

时间:2011-12-16 16:29:38

标签: regex dns text-parsing

我想使用RegEx来解析给定输入URL的根域。我已经知道,基本上没有RegEx可以在给定适当的输入URL的情况下“破坏”,这就是为什么我想将给定的RegEx的使用限制在给定TLD的列表中(如果可能的话) )。这是一个例子:

假设我有一个输入文件,并且将一次通过正则表达式运行文件中的每个URL。这是输入文件:

www.google.co.uk
www.google.co.uk/something
www.google.com/
www.google.com/something
google.com/
google.com/something
subdomain.google.com/
subdomain.google.com/something
www.subdomain.google.com/
www.google.net/
www.google.net/something
google.net/

最终结果应该是:

google.co.uk
google.co.uk
google.com
google.com
google.com
google.com
google.com
google.com
google.com
google.com
google.com
google.com

我想要的重要一点是,正则表达式要根据以下内容进行解析:

从给定TLD列表中查找给定URL中的TLD(例如:

(co.uk|com|net|edu|gov|etc|etc|etc)

如果发现其中一个给定的TLD,则匹配&解析它发现的TLD左侧(包括)的所有内容,UP UNTIL它或者到达行的开头或者它到达另一个“。”

如果可以根据给出的“伪代码”描述编写匹配的正则表达式,它应该完全按照所示解析出样本输入数据。

3 个答案:

答案 0 :(得分:2)

perl -ne 'print $2, "\n" if m-^([^/]+?\.|)([^./]*\.(co\.uk|com|net|edu|gov|etc|etc|etc))(/.*|)$-'  /tmp/x.txt

似乎给出了您正在寻找的结果,至少在您提供的示例数据上(假设您不想将google.net转换为google.com)。

请注意,我确实对我的[^。/]有点懒,这可能会匹配域名中不合法的字符。然后,i18n可能已经重写了DNS的规则,以包含比我年轻时更多的角色。

答案 1 :(得分:1)

在Java中:

package test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {

        String subject = "www.google.co.uk\nwww.google.co.uk/something\nwww.google.com/\nwww.google.com/something\ngoogle.com/\ngoogle.com/something\nsubdomain.google.com/\nsubdomain.google.com/something\nwww.subdomain.google.com/\nwww.google.net/\nwww.google.net/something\ngoogle.net/\n";
        Pattern pattern = Pattern.compile("(\\w+)\\.(co.uk|com|net|edu|gov)");

        Matcher m = pattern.matcher(subject);
        int count = 0;
           while(m.find()) {
               count++;
               System.out.println(m.group());
          }
    }
}

正则表达式= (\w+)\.(co.uk|com|net|edu|gov)

答案 2 :(得分:0)

实际上,由于很多原因,无法使用正则表达式解析uri。例如,localhost,192.168.0.43,www.google.co.uk都是有效的。

但是,如果你在'。'之前提取最后一个元素,你不希望你的IP地址中的'43'作为TLD,那里有很多例外(co.uk和bl.uk有两种不同的行为) )。

我在那里写了一个C库/ Python绑定和命令行工具:http://www.github.com/stricaud/faup所以你可以这样做:

$ faup -p www.example.com
scheme,credential,subdomain,domain,host,tld,port,resource_path,query_string,fragment
,,www,example.com,www.example.com,com,,,,

要获取域名,您可以拥有包含所有域名的文件,并通过faup运行:

$ cat urls.txt |faup -f domain
google.co.uk
google.co.uk
google.com
google.com
google.com
google.com
google.com
google.com
google.com
google.net
google.net
google.net

如果你只想要tld,你可以使用-f tld参数,例如:

$ faup -f tld www.example.com
com

甚至,得到一个json输出:

$ faup -o json http://www.test.co.uk/index.html?foo=bar#tagada
{
    "scheme": "http",
    "credential": "",
    "subdomain": "www",
    "domain": "test.co.uk",
    "host": "www.test.co.uk",
    "tld": "co.uk",
    "port": "",
    "resource_path": "/index.html",
    "query_string": "?foo=bar",
    "fragment": "#tagada"
}

这不仅比正则表达式更快,而且还可以处理您在想要执行像域/ tld提取这样简单的事情时遇到的所有特定情况。