【问题标题】:Using Matcher to extract URL domain name使用 Matcher 提取 URL 域名
【发布时间】:2015-08-17 13:34:19
【问题描述】:
    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 中提取域名并忽略其余部分。但问题是,首先,如果 URL 有更深的路径,它不会忽略它,其次,它不适用于所有带有 .com 扩展名的 URL。

例如,如果 URL 是http://www.lego.com/en-us/technic/?domainredir=technic.lego,则结果将不是lego,而是lego.com/en-us/technic/?domainredir=technic.lego

【问题讨论】:

    标签: regex url matcher


    【解决方案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);
        }
    }
    

    【讨论】:

    • 没错。还有一个问题你可以帮忙。如果我想让每条更深的路径都可以提取,我应该迭代matcher.group(i)?
    • 考虑到问题的例子,http://www.lego.com/en-us/technic/?domainredir=technic.lego我想访问technic甚至?domainredir=technic.lego
    • 如果你有固定数量的 URL 部分和查询元素,你可以使用更多的捕获组:http://www\\.([^/&]+)\\.com/([^/]+)/([^/]+)/([^/]+) 并使用.group(2)group(3) 访问它们。还有另一种方法可以使用\G 操作符访问这些未知数量的 URL 部分:(?:http://www\\.([^/&]+)\\.com/|(?!^)\\G)/?([^/]+),但使用起来会比较困难,因为第一个匹配项将包含域名和后续部分,以下匹配项将只包含子部分。
    • 我不知道,但显然你的正则表达式不起作用。
    • 这是因为如果需要匹配文字,需要使用双反斜杠,并且需要使用find而不是matches
    猜你喜欢
    • 2018-09-08
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2022-01-16
    • 1970-01-01
    • 2011-05-06
    • 2017-10-16
    相关资源
    最近更新 更多