使用Matcher提取URL域名

时间:2015-08-17 13:34:20

标签: regex url matcher

    static String AdrPattern="http://www.([^&]+)\\.com\\.*";
    static Pattern WebUrlPattern = Pattern.compile (AdrPattern);
    static Matcher WebUrlMatcher;
                WebUrlMatcher = WebUrlPattern.matcher ("keyword");
                if(WebUrlMatcher.matches())
             String  extractedPath = WebUrlMatcher.group (1);

考虑到上述代码,我的目的是从URL中提取域名并解除其余的域名。但问题是,首先,如果网址有更深的路径,则不会忽略它;其次,它不适用于所有带.com扩展名的网址。

例如,如果网址为http://www.lego.com/en-us/technic/?domainredir=technic.lego,则结果不会是lego,而是lego.com/en-us/technic/?domainredir=technic.lego

1 个答案:

答案 0 :(得分:1)

使用

static String AdrPattern="http://www\\.([^&]+)\\.com.*";
                                    ^^              ^

您逃脱了最后一个点,并将其视为文字,matches无法匹配整个字符串。此外,必须转义第一个点。

另外,为了使正则表达式更加严格,您可以将[^&]+替换为[^/&]

<强>更新

static String AdrPattern="http://www\\.([^/&]+)\\.com/([^/]+)/([^/]+)/([^/]+).*";
static Pattern WebUrlPattern = Pattern.compile (AdrPattern);
static Matcher WebUrlMatcher = WebUrlPattern.matcher("http://www.lego.com/en-us/technic/?domainredir=technic.lego");
if(WebUrlMatcher.matches()) {
    String  extractedPath = WebUrlMatcher.group(1);
    String  extractedPart1 = WebUrlMatcher.group(2);
    String  extractedPart2 = WebUrlMatcher.group(3);
    String  extractedPart3 = WebUrlMatcher.group(4);
}

或者\G

static String AdrPattern="(?:http://www\\.([^/&]+)\\.com/|(?!^)\\G)/?([^/]+)";
static String AdrPattern="http://www\\.([^/&]+)\\.com/([^/]+)/([^/]+)/([^/]+)";
static Pattern WebUrlPattern = Pattern.compile (AdrPattern);
static Matcher WebUrlMatcher = WebUrlPattern.matcher("http://www.lego.com/en-us/technic/?domainredir=technic.lego");
int cnt = 0;
while(WebUrlMatcher.find()) {
    if (cnt == 0) {
       String extractedPath = WebUrlMatcher.group(1);
       String extractedPart = WebUrlMatcher.group(2);
       cnt = cnt + 1;
    }
    else {
       String extractedPart = WebUrlMatcher.group(2);
    }
}