Позвольте мне пойти дальше и предсказать это, сказав, что я не большой сторонник регулярных выражений для сложных случаев. Попытка написать идеальное выражение для чего-то подобного очень трудна. Тем не менее, , у меня действительно есть один для обнаружения URL-адресов, и он подкреплен проходным классом юнит-тестов в 350 строк. Кто-то начал с простого регулярного выражения, и за эти годы мы увеличили количество выражений и тестовых случаев, чтобы справиться с найденными проблемами. Это определенно не тривиально:
// Pattern for recognizing a URL, based off RFC 3986
private static final Pattern urlPattern = Pattern.compile(
"(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)"
+ "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*"
+ "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Вот пример его использования:
Matcher matcher = urlPattern.matcher("foo bar http://example.com baz");
while (matcher.find()) {
int matchStart = matcher.start(1);
int matchEnd = matcher.end();
// now you have the offsets of a URL match
}