我一直无法找到这个,而我正在尝试的并不适合我。
我想只匹配以下域名:
匹配的示例域名:
不匹配的示例域名:
我目前得到了什么:
/^(?!:\/\/)(^[a-zA-Z0-9])?.[a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/i
它不匹配协议,允许在域内使用连字符,不允许在TLD之后使用尾随字符,并允许子域(但只有1个字符)。
我仍然需要允许任意长度的子域名,不允许www.subdomain.domain.com并且不允许使用前导连字符。
答案 0 :(得分:15)
尝试
/^(?!:\/\/)([a-zA-Z0-9]+\.)?[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/i
答案 1 :(得分:4)
让我们分析你的正则表达式:
^(?!:\/\/)
这很没用。虽然它表明正则表达式的意图,但它是不必要的,因为以下字符不允许包含斜杠。
(^[a-zA-Z0-9])?.
我想你希望这是^([a-zA-Z0-9]+\.)?
。您的点不会被转义,并且在字符串开头只会有一个可选字符。
[a-zA-Z0-9-]+
如果您希望这不是以连字符开头,您可以使用否定前瞻或更好[a-zA-Z0-9][a-zA-Z0-9-]*
。
\.[a-zA-Z]{2,6}?
不确定问号在这里做了什么。无论如何都没有回溯?
/i
这使得显式[a-zA-Z]
无效,一个就足够了。或者省略i
标志。
所有这些事情在一起,我们最终会以
结束/^([a-z0-9]+\.)?[a-z0-9][a-z0-9-]*\.[a-z]{2,6}$/i
答案 2 :(得分:1)
答案 3 :(得分:0)
我在Javascript中执行主机名/ FQDN验证时提出了RegEx:
<强> FQDN:强>
^(?!:\/\/)(?!.{256,})(([a-z0-9][a-z0-9_-]*?\.)+?[a-z]{2,6}?)$/i
主机名或FQDN
^(?!:\/\/)(?!.{256,})(([a-z0-9][a-z0-9_-]*?)|([a-z0-9][a-z0-9_-]*?\.)+?[a-z]{2,6}?)$/i
两个表达式都使用lookahead来检查总字符串长度,最长可达255个字符。他们也进行了懒惰的检查.{x,y}?
。
请注意,它使用不区分大小写的匹配/i
。