проблемы с моим регулярным выражением для определения URL в строке? - PullRequest
2 голосов
/ 23 декабря 2010

Приветствую всех. Я использую следующее регулярное выражение для определения URL в строке и оберните их внутри тега

public static String detectUrls(String text) {

        String newText = text
                .replaceAll("(?:https?|ftps?|http?)://[\\w/%.-?&=]+",
                        "<a href='$0'>$0</a>").replaceAll(
                        "(www\\.)[\\w/%.-?&=]+", "<a href='http://$0'>$0</a>");
        return newText;
    }

У меня проблема с тем, что следующие ссылки не обнаружены правильно: я не так хорош в регулярных выражениях, поэтому, пожалуйста, посоветуйте.

http://code.google.com/p/shindig-dnd/

http://confluence.atlassian.com/display/GADGETDEV/Gadgets+and+JIRA+Portlets

www.liferay.com / веб / raymond.auge / блог /

(www.opensocial.org /)

http://www.google.com

Ответы [ 3 ]

3 голосов
/ 23 декабря 2010

Я использую это:

private static final String URL_REGEX = 
   "http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?";

Matcher matcher = URL_PATTERN.matcher(text);
text = matcher.replaceAll("<a href=\"$0\">$0</a>");
return text;
2 голосов
/ 23 декабря 2010

Ваша проблема в том, что вы используете - в группе символов ([]), не экранируя ее, что используется для определения диапазона .-? (то есть символов ./0123456789:;<=>?). Либо экранируйте его \\-, либо поместите в конец класса символов, чтобы он не заканчивал диапазон.

public static String detectUrls(String text) {
    String newText = text
            .replaceAll("(?:https?|ftps?|http?)://[\\w/%.\\-?&=]+",
                    "<a href='$0'>$0</a>").replaceAll(
                    "(www\\.)[\\w/%.\\-?&=]+", "<a href='http://$0'>$0</a>");
    return newText;
}
1 голос
/ 23 декабря 2010

Как сказал marcog, вы должны экранировать - и, чтобы соответствовать последним 2 приведенным вами примерам, вы должны сделать опцию http.Также http? соответствует htt, который не является правильным протоколом.

Таким образом, регулярное выражение будет:

"(?:(?:https?|ftps?)://)?[\\w/%.?&=-]+"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...