我正在使用此正则表达式来检测用户在输入域名时是否包含了协议 - 我不希望他们这样做:
if (/^[^http:\/\/|www.][a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i.test(inp2){
... ok ...
}
它有97%的时间工作,然后我意识到为什么有些名字失败了 - 它不匹配整个 协议它匹配任何具有字符h,t,t,p或w,w,w的内容,而不是将它们视为整个单词'http //:'或'www。'
我在测试时发现:
**hattooflat.com**
哪个应该通过,但是字符h,t,t使它失败
我认为我需要单词边界\ b但我不知道在哪里:
(/^\b[^http:\/\/|www.]\b[a-zA-Z0-9\-]+\.( .....
或
(/^[^\bhttp:\b\/\/|\bwww\b.][a-zA-Z0-9\-]+\.( .....
我知道我很接近 - 正在进行4年后,正则表达式仍然让我感到悲伤
答案 0 :(得分:4)
实际上,您需要 look-aheads :
/^(?!https?:\/\/|www\.)[a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i
另请参阅此 short demo 。
简短说明:
^
:匹配字符串的开头(假设是单行输入)。
(?!<...>)
:不消费任何字符,但请向前看并确保字符串的下一部分不匹配{{ 1}}(负向前瞻)。
<...>
:匹配https?:\/\/|www\.
或http://
或https://
(www.
后,'s'使其成为“可选”)。
?
:匹配包含一个或多个字母数字字符或“ - ”的任何序列。
[a-zA-Z0-9\-]+
:匹配一个点('。')。
\.
:匹配(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)
或co.uk
或com
或...
net
:匹配字符串的结尾(假设是单行输入)。
答案 1 :(得分:2)
正则表达式中的方括号表示字符类,所以
[^http:\/\/|www.]
表示与[^:/|.htpw]
相同,并匹配任何不是h,t,p,:,/,|,w或的单个字符。你可能想要一个负面的前瞻
^(?!https?:\/\/|www\.)
匹配不以http://
,https://
或www.
答案 2 :(得分:0)
如果您只想识别没有协议和子域名的域名,为什么不使用这个正则表达式:
^([a-zA-Z0-9]{2}|([a-zA-Z0-9][a-zA-Z0-9\-])+[a-z0-9])\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$
正则表达式允许长度为2的域名和长度为3的域名,包括非连续(非尾随,非前导)连字符。