Извлечение URL-адресов из текстового документа с использованием Java + Regular Expressions
Я пытаюсь создать регулярное выражение для извлечения URL-адресов из текстовых документов с помощью Java, но до сих пор я не увенчался успехом. Ниже перечислены два случая, которые я ищу:
URL-адреса, начинающиеся с http://
URL-адреса, начинающиеся с www. (Отсутствует протокол с фронта)
вместе с параметрами строки запроса.
Спасибо! Хотелось бы, чтобы я действительно знал регулярные выражения лучше.
Приветствия,
Ответы
Ответ 1
Если вы хотите убедиться, что вы действительно соответствуете 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+:\\[email protected])?(([-\\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;
}
}
Ответ 2
Все RegEx основаны на перепроектированном, особенно в коде с самым проголосовавшим ответом, и вот почему: он найдет только действительные URL-адреса! В качестве примера он будет игнорировать все, начиная с "http://" и не имеющих символов ASCII внутри.
Более того: я встречал 1-2-секундное время обработки (однопоточное, выделенное) с пакетом Java RegEx для очень маленьких и простых предложений, ничего конкретного; возможно ошибка в Java 6 RegEx...
Самое простое/быстрое решение - использовать StringTokenizer для разделения текста на токены, для удаления токенов, начинающихся с "http://" и т.д., и для повторного объединения токенов в текст.
Если вы действительно хотите использовать RegEx с Java, попробуйте Automaton
Ответ 3
Эта ссылка имеет очень хорошие URL-адреса RegEx (их, кстати, трудно добиться, между прочим - thinh http/https; port # s, действительные символы, строки GET, значки фунта для привязных ссылок и т.д.)
http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/
Perl имеет библиотеки CPAN, которые содержат cannedRegExes, в том числе для URL-адресов. Не уверен в Java, хотя: (
Ответ 4
Это проверяет определенную строку, если это 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
}