C# 正则表达式的问题!!

示申○言舌 2018-07-19 05:08:17

我想匹配一个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%])*))?)?$"

...全文
100 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
示申○言舌 2018-07-19
  • 打赏
  • 举报
回复
我晕。已经知道了。。哈哈。。
游北亮 2018-07-19
  • 打赏
  • 举报
回复
没你想的那么复杂,随便写了一个到端口为止的正则:

(?i)https?://(?:[\w-]+\.)*[\w-]+(?::\d+)?


110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧