This should get just about anything (feel free to add additional protocols):
@"(https?|ftp|file)://[A-Za-z0-9.-]+(/[A-Za-z0-9?&=;+!'()*-._~%]*)*"
The real difficulty is finding the end. As is, this pattern relies on finding an invalid character. That would be anything other than letters, numbers, hyphen or period before the end of the domain name, or anything other than those plus forward slash (/), question mark (?), ampersand (&), equals sign (=), semicolon (;), plus sign (+), exclamation point (!), apostrophe/single quote ('), open/close parentheses, asterisk (*), underscore (_), tilde (~), or percent sign (%) after the domain name.
Note that this would allow invalid URLs like
http://../
And it would pick up stuff after a URL, such as in this string:
Maybe you should try http://www.google.com.
Where "http://www.google.com."
(with the trailing period) would be matched.
It would also miss URLs that didn't begin with a protocol specification (specifically, the protocols within the first set of parentheses. For instance, it would miss the URL in this string:
Maybe you should try www.google.com.
It's very difficult to get every case without some better-defined boundaries.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…