/* 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" } ; Pattern REGEX = Pattern.compile ( "(?i)^(?:(?: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*)?$" ) ;
Matcher matcher = REGEX.matcher ( url) ;
if ( matcher.find ( ) ) {
System .
out .
println ( matcher.
group ( ) ) ; }
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlTdHJpbmdbXSBVUkxzID0gbmV3IFN0cmluZ1tdIHsgImh0dHA6Ly9mLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5vLmNvbS9ibGFoX2JsYWgiLCAiaHR0cDovL2YuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm8uY29tL2JsYWhfYmxhaC8iLCAiaHR0cDovL2YuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm8uY29tL2JsYWhfYmxhaF8od2lraXBlZGlhKSIsICJodHRwOi8vZi4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uby5iYXI/cT1TcGFjZXMgc2hvdWxkIGJlIGVuY29kZWQiIH07CgkJUGF0dGVybiBSRUdFWCA9IFBhdHRlcm4uY29tcGlsZSgiKD9pKV4oPzooPzpodHRwcz98ZnRwKTovLykoPzpcXFMrKD86OlxcUyopP0ApPyg/Oig/ISg/OjEwfDEyNykoPzpcXC5cXGR7MSwzfSl7M30pKD8hKD86MTY5XFwuMjU0fDE5MlxcLjE2OCkoPzpcXC5cXGR7MSwzfSl7Mn0pKD8hMTcyXFwuKD86MVs2LTldfDJcXGR8M1swLTFdKSg/OlxcLlxcZHsxLDN9KXsyfSkoPzpbMS05XVxcZD98MVxcZFxcZHwyWzAxXVxcZHwyMlswLTNdKSg/OlxcLig/OjE/XFxkezEsMn18MlswLTRdXFxkfDI1WzAtNV0pKXsyfSg/OlxcLig/OlsxLTldXFxkP3wxXFxkXFxkfDJbMC00XVxcZHwyNVswLTRdKSl8KD86KD86W2EtelxcdTAwYTEtXFx1ZmZmZjAtOV0tKikqW2EtelxcdTAwYTEtXFx1ZmZmZjAtOV0rKSg/OlxcLig/OlthLXpcXHUwMGExLVxcdWZmZmYwLTldLSopKlthLXpcXHUwMGExLVxcdWZmZmYwLTldKykqKD86XFwuKD86W2EtelxcdTAwYTEtXFx1ZmZmZl17Mix9KSlcXC4/KSg/OjpcXGR7Miw1fSk/KD86Wy8/I11cXFMqKT8kIik7CgkJZm9yIChTdHJpbmcgdXJsIDogVVJMcykgewogICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBSRUdFWC5tYXRjaGVyKHVybCk7CiAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1hdGNoZXIuZ3JvdXAoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQp9