/* package whatever; // don't place package name! */
import java.util.* ;
import java.lang.* ;
import java.io.* ;
import java.util.regex.* ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
//String[] URLs = new String[] { "http://f...content-available-to-author-only...o.com/blah_blah", "http://f...content-available-to-author-only...o.com/blah_blah/", "http://f...content-available-to-author-only...o.com/blah_blah_(wikipedia)", "http://f...content-available-to-author-only...o.bar?q=Spaces should be encoded" };
//String[] URLs = new String[] { "[20:56] <@Котофеич> http://s...content-available-to-author-only...l.com/pics/pics_original/3/4/2/5825243.jpg" };
// The URL above is invalid since it contains consecutive dots
String [ ] URLs
= new String [ ] { "[20:56] <@Котофеич> http://s...content-available-to-author-only...l.com/pics/pics_original/3/4/2/5825243.jpg" } ; Pattern REGEX = Pattern.compile ( "(?i)\\ b(?:(?:https?|ftp)://)(?:\\ S+(?::\\ S*)?@)?(?:(?!(?:10|127)(?:\\ .\\ d{1,3}){3})(?!(?:169\\ .254|192\\ .168)(?:\\ .\\ d{1,3}){2})(?!172\\ .(?:1[6-9]|2\\ d|3[0-1])(?:\\ .\\ d{1,3}){2})(?:[1-9]\\ d?|1\\ d\\ d|2[01]\\ d|22[0-3])(?:\\ .(?:1?\\ d{1,2}|2[0-4]\\ d|25[0-5])){2}(?:\\ .(?:[1-9]\\ d?|1\\ d\\ d|2[0-4]\\ d|25[0-4]))|(?:(?:[a-z\\ u00a1-\\ uffff0-9]-*)*[a-z\\ u00a1-\\ uffff0-9]+)(?:\\ .(?:[a-z\\ u00a1-\\ uffff0-9]-*)*[a-z\\ u00a1-\\ uffff0-9]+)*(?:\\ .(?:[a-z\\ u00a1-\\ uffff]{2,}))\\ .?)(?::\\ d{2,5})?(?:[/?#]\\ S*)?\\ b" ) ;
Matcher matcher = REGEX.matcher ( url) ;
if ( matcher.find ( ) ) {
System .
out .
println ( matcher.
group ( ) ) ; }
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQkvL1N0cmluZ1tdIFVSTHMgPSBuZXcgU3RyaW5nW10geyAiaHR0cDovL2YuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm8uY29tL2JsYWhfYmxhaCIsICJodHRwOi8vZi4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uby5jb20vYmxhaF9ibGFoLyIsICJodHRwOi8vZi4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uby5jb20vYmxhaF9ibGFoXyh3aWtpcGVkaWEpIiwgImh0dHA6Ly9mLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5vLmJhcj9xPVNwYWNlcyBzaG91bGQgYmUgZW5jb2RlZCIgfTsKCQkvL1N0cmluZ1tdIFVSTHMgPSBuZXcgU3RyaW5nW10geyAiWzIwOjU2XSA8QNCa0L7RgtC+0YTQtdC40Yc+IGh0dHA6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5sLmNvbS9waWNzL3BpY3Nfb3JpZ2luYWwvMy80LzIvNTgyNTI0My5qcGciIH07IAoJCS8vIFRoZSBVUkwgYWJvdmUgaXMgaW52YWxpZCBzaW5jZSBpdCBjb250YWlucyBjb25zZWN1dGl2ZSBkb3RzCgkJU3RyaW5nW10gVVJMcyA9IG5ldyBTdHJpbmdbXSB7ICJbMjA6NTZdIDxA0JrQvtGC0L7RhNC10LjRhz4gaHR0cDovL3MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmwuY29tL3BpY3MvcGljc19vcmlnaW5hbC8zLzQvMi81ODI1MjQzLmpwZyIgfTsKCQlQYXR0ZXJuIFJFR0VYID0gUGF0dGVybi5jb21waWxlKCIoP2kpXFxiKD86KD86aHR0cHM/fGZ0cCk6Ly8pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzooPyEoPzoxMHwxMjcpKD86XFwuXFxkezEsM30pezN9KSg/ISg/OjE2OVxcLjI1NHwxOTJcXC4xNjgpKD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXpcXHUwMGExLVxcdWZmZmYwLTldLSopKlthLXpcXHUwMGExLVxcdWZmZmYwLTldKykoPzpcXC4oPzpbYS16XFx1MDBhMS1cXHVmZmZmMC05XS0qKSpbYS16XFx1MDBhMS1cXHVmZmZmMC05XSspKig/OlxcLig/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfSkpXFwuPykoPzo6XFxkezIsNX0pPyg/OlsvPyNdXFxTKik/XFxiIik7CgkJZm9yIChTdHJpbmcgdXJsIDogVVJMcykgewogICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBSRUdFWC5tYXRjaGVyKHVybCk7CiAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1hdGNoZXIuZ3JvdXAoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQp9