我的域名Regex需要改进

我的域名Regex需要改进,regex,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.” 我

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

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**
这些都应该通过,但是这些字符使它失败了

我想我需要单词边界\b但我不确定在哪里:

(/^\b[^http:\/\/|www.]\b[a-zA-Z0-9\-]+\.( .....


我知道我已经很接近了——在4年的发展之后,正则表达式仍然让我感到悲伤

事实上,你需要

/^(?!https?:\/\/|www\.)[a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i
另请参见此


简要说明:

  • ^
    :匹配字符串的开头(假设为单行输入)

  • (?!)
    :不要使用任何字符,但向前看,并确保字符串的下一部分不匹配
    (负向前看)

  • https?:\/\/\124; www\.
    :匹配
    http://
    https://
    www.
    在“s”之后使其成为“可选”)

  • [a-zA-Z0-9\-]+
    :匹配包含一个或多个字母数字字符或“-”的任何序列

  • \。
    :匹配一个点('.')

  • (co\.uk | com | net | biz | org | org\.uk | eu | me\.uk)
    :匹配
    co.uk
    com
    net

  • $
    :匹配字符串的结尾(假设为单行输入)


  • 实际上,你需要:

    /^(?!https?:\/\/|www\.)[a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i
    
    另请参见此


    简要说明:

    • ^
      :匹配字符串的开头(假设为单行输入)

    • (?!)
      :不要使用任何字符,但向前看,并确保字符串的下一部分不匹配
      (负向前看)

    • https?:\/\/\124; www\.
      :匹配
      http://
      https://
      www.
      在“s”之后使其成为“可选”)

    • [a-zA-Z0-9\-]+
      :匹配包含一个或多个字母数字字符或“-”的任何序列

    • \。
      :匹配一个点('.')

    • (co\.uk | com | net | biz | org | org\.uk | eu | me\.uk)
      :匹配
      co.uk
      com
      net

    • $
      :匹配字符串的结尾(假设为单行输入)


    • 正则表达式中的方括号表示字符类,因此

      [^http:\/\/|www.]
      
      表示与
      [^:/|.htpw]
      相同,并匹配不是h、t、p、:、/、|、w或的任何单个字符。你可能想要一个消极的前瞻

      ^(?!https?:\/\/|www\.)
      

      它与不以
      http://
      https://
      www开头的字符串相匹配。正则表达式中的方括号表示字符类,因此

      [^http:\/\/|www.]
      
      表示与
      [^:/|.htpw]
      相同,并匹配不是h、t、p、:、/、|、w或的任何单个字符。你可能想要一个消极的前瞻

      ^(?!https?:\/\/|www\.)
      

      它匹配的字符串不以
      http://
      https://
      www.

      开头。如果您只想标识没有协议和子域的域名,为什么不使用此正则表达式:

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

      如果您只想识别没有协议和子域的域名,为什么不使用此正则表达式:

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

      您使用的正则表达式引擎是什么?如果引擎可以支持负面外观,这就是您可以使用的。您可能只想使用
      ([a-Za-z0-9\-]+\)?[a-z]{2,6}
      ,而不是输入大量任意TLD。对不起,不知道你的意思-但我使用jquery 1.8.3/Javascript@Niels Keurentjes我通常使用你的想法,但在这个应用程序中,重要的是只允许那些TLD声明@speakr你能告诉我需要做什么吗?你使用的是什么正则表达式引擎?如果引擎可以支持负面外观,这就是您可以使用的。您可能只想使用
      ([a-Za-z0-9\-]+\)?[a-z]{2,6}
      ,而不是输入大量任意TLD。对不起,不知道你的意思-但我使用jquery 1.8.3/Javascript@Niels Keurentjes我通常使用你的想法,但在这个应用程序中,重要的是只允许那些声明的TLD@speakr你能告诉我我需要做什么吗?重要的是只允许声明的TLD,没有其他的-也^[a-z0-9\-]允许http,www.它们就像域名一样,都是魔术师name@user962902好的,我修正了。重要的是,只允许TLD声明,不允许其他人-也^[a-z0-9\-]允许http,www-它们只是域中的字符name@user962902可以我修正了。好的,第一个回答的人一直在删除他的帖子,所以无法标记——因为你的帖子也有一个很好的提琴例子和解释,这将有助于我将来学习,我标记了你的帖子——很多thanks@user962902这个答案和普斯基斯之间有很大区别。请看伊恩·罗伯茨的回答,它解释了这一点。我知道现在-这就是为什么它被删除了,因为它是错误的-虽然产生了正确的结果-但是我无法与普乌斯基索克沟通,给出第一个答案的人一直在删除他的帖子,所以无法标记它-因为你的文章也有一个很好的例子和解释