Синтаксический анализ домена URL с помощью регулярных выражений - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу проанализировать домен URL (без 'www') с regex и вернуть его.Существует много примеров для этого в stackoverflow, но они не обеспечивают решение для всех случаев ниже или некоторые из них имеют ненужные функции.Мои случаи:

http://www.google.co.uk      pass
http://www.google.co.uk      pass
http://google.com.co.uk      pass
same for https               pass
google.co.uk                 pass
www.google.co.uk             pass

и все должны возвращать только часть домена google.co.uk Нет необходимости в таких ссылках, как 101.34.24 .. или запуск для fps и т. Д... Только допустимые форматы ввода указаны выше.И я проверяю URL с помощью регулярного выражения: ^(https?:\/\/)?(www\.)?([\w]+\.)+[‌​\w]{2,63}\/?$, и он работает хорошо, но я не знаю, как его анализировать.

Примечание: я был бы рад, если вы не порекомендуете классы URI или URL и их методы дляразбирать домен автоматически, например:

private String parseUrl(String url) throws URISyntaxException {
        if (url.startsWith("http:/")) {
            if (!url.contains("http://")) {
                url = url.replaceAll("http:/", "http://");
            }
        } else if (url.startsWith("https:/")) {
            url = url.replaceAll("https:/", "http:/");
        } else {
            url = "http://" + url;
        }
        URI uri = new URI(url);
        String domain = uri.getHost();
        return domain.startsWith("www.") ? domain.substring(4) : domain;
    }

Этот код также отлично работает, но мне нужно регулярное выражение , а не этот.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Ваше регулярное выражение,

^(https?:\/\/)?(www\.)?([\w]+\.)+[‌​\w]{2,63}\/?$

соответствует вводу, но не правильно захватывает предполагаемый домен в группе.Вы можете изменить его и сделать его таким простым:

^(?:https?:\/\/)?(?:www\.)?((?:[\w]+\.)+\w+)

, который захватывает ваш предполагаемый захват домена в группе 1.

Live Demo

Вот пример кода Java с использованием извлечения и печати доменного имени,

public static void main(String[] args) throws SQLException {
    Pattern p = Pattern.compile("^(?:https?:\\/\\/)?(?:www\\.)?((?:[\\w]+\\.)+\\w+)");
    List<String> list = Arrays.asList("http://www.google.co.uk", "http://www.google.co.uk",
            "http://google.com.co.uk", "https://www.google.co.uk", "https://www.google.co.uk",
            "https://google.com.co.uk");

    list.forEach(x -> {
        Matcher m = p.matcher(x);
        if (m.matches()) {
            System.out.println(x + " --> " +m.group(1));
        }
    });
}

Prints,

http://www.google.co.uk --> google.co.uk
http://www.google.co.uk --> google.co.uk
http://google.com.co.uk --> google.com.co.uk
https://www.google.co.uk --> google.co.uk
https://www.google.co.uk --> google.co.uk
https://google.com.co.uk --> google.com.co.uk
0 голосов
/ 14 декабря 2018

Решение состоит в том, чтобы добавить группу захвата, чтобы покрыть этот раздел URL, здесь будет работать ^(https?://)?(www\.)?(([\w]+\.)+[‌​\w]{2,63})/?$.

Кроме того, вам просто нужно использовать Matcher, чтобы получить правильную группу (группа 3здесь):

private static Pattern URL_PATTERN =
        Pattern.compile("^(https?://)?(www\.)?(([\w]+\.)+[‌​\w]{2,63})/?$");

public static String minifyUrl(final String url) {
    final Matcher matcher = URL_PATTERN.matcher(url);
    if (matcher.find()) return matcher.group(3);
    else return url;
}

Тем не менее, я все еще думаю, что вам будет лучше обслужить, используя класс URL Java: p

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...