我的域名Regex需要精炼

时间:2013-06-20 09:19:12

标签: regex

我正在使用此正则表达式来检测用户在输入域名时是否包含了协议 - 我不希望他们这样做:

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年后,正则表达式仍然让我感到悲伤

3 个答案:

答案 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.ukcom或...

  • 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的域名,包括非连续(非尾随,非前导)连字符。