Найти URL в строке - PullRequest
       1

Найти URL в строке

1 голос
/ 16 марта 2012

Привет, я пытаюсь найти URL в строке, я основал много тем об этом с помощью регулярных выражений, но у меня есть проблема Используя этот шаблон:

String regex = "\\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";

На большинстве страниц работает довольно хорошо, но у меня есть проблема с другими. Например:

http://hello.com/hello мир

возвращает

http://hello.com/hello

Проблема в том, что пространство.

У кого-нибудь есть хороший шаблон, который решает эту проблему?

Спасибо.

РЕДАКТИРОВАТЬ :: это мой код

private ArrayList<String> pullLinks(String text) {
    ArrayList<String> links = new ArrayList<String>();

    String regex = "\\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";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(text);
    while(m.find()) {
    String urlStr = m.group();
    if (urlStr.startsWith("(") && urlStr.endsWith(")"))
    {
    urlStr = urlStr.substring(1, urlStr.length() - 1);
    }
    links.add(urlStr);
    }
    return links;
    }  

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Пробелы в URL не допускаются (их необходимо заменить на %20). Смотрите, например, ответ на этот вопрос:

Если вы все равно разрешите URL-адресам включать пробелы, то как бы вы интерпретировали, например, http://www.google.com/ig is a nice webpage? Ясно, что часть после /ig не должна быть включена!

0 голосов
/ 16 марта 2012

Пробел не является допустимым символом URL.

Кроме того, если вы не используете пробелы в качестве терминатора, как вы собираетесь найти конец URL?

Ваше регулярное выражение также не может учитывать другие домены верхнего уровня (например, .int).На самом деле я не уверен, почему он вообще ищет конкретные TLD, поскольку они не обязаны формировать действительный URL.

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