在Java中使用正则表达式匹配子域和顶级域

时间:2012-09-13 08:17:16

标签: java regex

跟进这个问题 Regex to match pattern with subdomain in java

我使用以下模式匹配域和子域

  Pattern pattern = Pattern.compile("http://([a-z0-9]*.)example.com");

此模式与以下

匹配
  • http://asd.example.com
  • http://example.example.com
  • http://www.example.com

但它不匹配

  • http://example.com

任何人都可以告诉我如何匹配http://example.com吗?

2 个答案:

答案 0 :(得分:1)

只需使用?

选择第一部分
Pattern pattern = Pattern.compile("http://([a-z0-9]*\\.)?example\\.com");

请注意.匹配任何字符,您应使用\\.来匹配文字点。

答案 1 :(得分:0)

您可以使用此正则表达式模式获取所有网址的域名:

\\p{L}{0,10}(?:://)?[\\p{L}\\.]{1,50}

例如;

Input  = http://www.google.com/search?q=a
Output = http://www.google.com

Input  = ftp://www.google.com/search?q=a
Output = ftp://www.google.com

Input  = www.google.com/search?q=a
Output = www.google.com

这里,\ p {L} {0,10}代表http,https和ftp部分(可能还有一些我不知道),(?:: //)?代表://部分如果出现,[\ p {L} \。] {1,50}代表foo.bar.foo.com部分。网址的其余部分被剪掉了。

这是完成工作的java代码:

public static final String DOMAIN_PATTERN = "\\p{L}{0,10}(?:://)?[\\p{L}\\.]{1,50}";

public static String getDomain(String url) {
    if (url == null || url.equals("")) {
        return "";
    }
    Pattern p = Pattern.compile(DOMAIN_PATTERN);
    Matcher m = p.matcher(url);

    if (m.find()) {
        return m.group();
    }
    return "";
}

public static void main(String[] args) {
    System.out.println(getDomain("www.google.com/search?q=a"));
}

Output = www.google.com

最后,如果您只想匹配“example.com”,您只需将其添加到模式的末尾,如:

\\p{L}{0,10}(?:://)?[\\p{L}\\.]{0,50}example\\.com

这将通过“example.com”获得所有域名:

Input  = http://www.foo.bar.example.com/search?q=a
Output = http://www.foo.bar.example.com

注意:请注意\ p {Ll}可以用来代替\ p {L},因为\ p {Ll}捕获小写的unicode字母(\ p {L}所有类型的unicode字母)并且url由小写构成字母。