Извлечение URL-адресов из текстового документа с использованием регулярных выражений Java + - PullRequest
12 голосов
/ 27 ноября 2009

Я пытаюсь создать регулярное выражение для извлечения URL-адресов из текстовых документов с использованием Java, но до сих пор мне не удавалось. Два случая, которые я хочу снять, перечислены ниже:

URL-адреса, начинающиеся с http: // URL, которые начинаются с www. (Отсутствует протокол с фронта)

вместе с параметрами строки запроса.

Спасибо! Хотелось бы, чтобы я действительно знал Регулярные выражения лучше.

Приветствия

Ответы [ 4 ]

26 голосов
/ 27 ноября 2009

Если вы хотите убедиться, что действительно соответствует URL-адресу, а не только какому-то слову, начинающемуся с «www». Вы можете использовать выражение, упомянутое ранее DVK. Я немного изменил его и написал небольшой фрагмент кода, который станет для вас отправной точкой:

import java.util.*;
import java.util.regex.*;

class FindUrls
{
    public static List<String> extractUrls(String input) {
        List<String> result = new ArrayList<String>();

        Pattern pattern = Pattern.compile(
            "\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + 
            "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" + 
            "|mil|biz|info|mobi|name|aero|jobs|museum" + 
            "|travel|[a-z]{2}))(:[\\d]{1,5})?" + 
            "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + 
            "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
            "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + 
            "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
            "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + 
            "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b");

        Matcher matcher = pattern.matcher(input);
        while (matcher.find()) {
            result.add(matcher.group());
        }

        return result;
    }
}
5 голосов
/ 17 января 2013

Все RegEx код на основе перегружен , особенно код из наиболее проголосовавшего ответа, и вот почему: он найдет только действительные URL ! Например, он будет игнорировать все, что начинается с "http://" и содержит символы, не входящие в ASCII.

Еще больше: я столкнулся с 1-2-секундным временем обработки (однопоточным, выделенным) с пакетом Java RegEx для очень маленьких и простых предложений, ничего конкретного; возможно ошибка в Java 6 RegEx ...

Самое простое / быстрое решение - использовать StringTokenizer для разбиения текста на токены, удаления токенов, начинающихся с "http://" и т. Д., И повторного объединения токенов в текст.

Если вы действительно хотите использовать RegEx с Java, попробуйте Автомат

3 голосов
/ 27 ноября 2009

Эта ссылка имеет очень хорошие URL RegExs (кстати, их на удивление сложно получить правильно - тонкие http / https; номера портов, допустимые символы, строки GET, знаки фунта для якорных ссылок, и т.д ...)

http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/

Perl имеет библиотеки CPAN, которые содержат cannedRegExes, в том числе для URL. Не уверен насчет Java, хотя: (

1 голос
/ 27 ноября 2009

Это проверяет определенную строку, если это URL

Pattern p = Pattern.compile("http://.*|www\\..*");
Matcher m = p.matcher("http://..."); // put here the line you want to check
if(m.matches()){
    so something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...