我想使用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它或者到达行的开头或者它到达另一个“。”
如果可以根据给出的“伪代码”描述编写匹配的正则表达式,它应该完全按照所示解析出样本输入数据。
答案 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提取这样简单的事情时遇到的所有特定情况。