我想匹配一个URL。网上查了很多,发现没有一个好用的。我只是想检测域名是否合法
为了简单起见,暂时不考虑协议、端口号、GET请求的各种参数问题。单纯的匹配一个域名。
你一定会说,这还不简单,下面这条就OK了。。
Regex reg = new Regex(@"^[\w.]+$");
是的,没错,大多数情况下这条匹配是正确的。但是,一些错误的URL却不能识别。
比如:
字符串 匹配结果 问题
localhost OK // 匹配没有问题
192.168.0.1 OK // 匹配没有问题
www.abc.com OK // 匹配没有问题
.abc OK // 这里就有问题了 因为域名不可能是 . 开头的。
www.abc. OK // 这里也有问题 因为域名最后不能以.结尾
为了修正上面的错误。我改了一下正则:
Regex reg = new Regex(@"^\w[\w.]*?\w$");
改了上面的正则之后,以.开头或者结尾的情况的确是可以识别了。。但是,又有一个新的问题,就是域名的长度必须是2个字符以上。
假如域名只有一个字母(
请不要较劲是不是存在只有一个字母的域名,一个字母的域名是合法的),那么这条正则就匹配不了。因为他两头都是一个\w,那就至少是需要两个字母。。。
所以,我的问题是,如何能够写一个正则,似的某个子模式下必须是\w开头,\w结尾,可以得到下列结果:
字符串 应得到的结果
a √
ab √
a.b √
a.b.c √
. ×
.abc.com ×
abc. ×
因为域名只是整个URL中的一部分,所以,请不要使用 ^ 和 $来限定字符串的开头和结尾,之所以具这个例子只是为了简单,我最终的需求是识别整个URL。
现在的正则是这样的:
"^((?<pro>http(s)?)://)?(?<url>(?<hst>[\w-]([\w.-]+?)[\w-])(:(?<pot>[0-9]+))?(/[\w-][\w.-]+?[\w-]\z)*)(/?(<par>[\w%]=[/w%](&[/w%]=[/w%])*))?)?$"