^(https?:\/\/([a-zA-Z0-9\-]{1,64}\.){0,127}([a-zA-Z0-9\-]{3,64})\.\w{2,4}(\/.*)?)?$
我只需要匹配网站网址(没有IP,端口,用户名/密码等)。这个正则表达式中是否存在任何严重缺陷?
编辑:这是一个略有改进的地方:
^(https?:\/\/([a-zA-Z0-9\-]{1,64}\.){0,127}([a-zA-Z0-9\-]{1,64})\.\w{2,7}(\/.*)?)?$
我意识到域名无法以破折号开头或结尾。有没有一种简单的方法可以匹配以破折号开头或结尾的域名?
答案 0 :(得分:0)
在第一部分中,你是非常严格的,只允许使用[a-zA-Z0-9\-]
字符,在最后一部分中你允许任何内容,但换行符。
==>在第一部分中,您缺少许多有效字符,在最后一部分中,您将匹配任何内容直到字符串结尾。
为什么不简化这个并匹配以http
开头并且到最后没有空格的任何内容?
^https?:\/\/\S+$
要避免域名中的开始/结束短划线,请在第二个表达式中使用外观。我还将.*
替换为\S*
^(https?:\/\/([a-zA-Z0-9\-]{1,64}\.){0,127}((?!-)[a-zA-Z0-9\-]{1,64})(?<!-)\.\w{2,7}(\/\S*)?)?$
为什么要使用周围的()?
制作完整的表达式。所以它也会匹配一个空字符串。