Regexp:检查重复组是否包含至少一次字母

时间:2015-12-02 18:21:50

标签: regex url-validation

我正在学习正则表达式并且有一个任务来创建表达式来验证URL(我有一个特定的URL列表,必须验证并且必须失败)。这是我目前拥有的

^((https?:\/\/)(?=.*[A-Za-z]+.*)(([A-Za-z0-9]+\-*[A-Za-z0-9]+|[A-Za-z0-9])\.){1,}([A-Za-z]+)\/?$)

在所有其他网址中,这些网址必须验证:

http://1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa
http://0test.com/

然而,这些必须失败:

http://1234567890123456789012345678901234567890123456789012345678901234.com
http://0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.com

他们必须失败,因为他们没有域名中的字母(仅限顶级域名),而且我不明白如何排除它们。

我添加了一个积极的前瞻:

(?=.*[A-Za-z]+.*)

我希望它只会检查以下重复组:

(([A-Za-z0-9]+\-*[A-Za-z0-9]+|[A-Za-z0-9])\.){1,}

但它检查整个表达式直到结束,即它也检查顶级域名。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你有正确的想法,但正如你所说,你不希望前瞻占据顶级域名。因此,请在您的展望中包含该匹配的副本:

(?=.*[A-Za-z]+.*\.([A-Za-z]+)$\/?)
                 ^-------- will match the top level domain
                          ^ will ensure its the last part of the domain

我还将您的A-z更改为A-Za-z(不确定是否错字,但提醒A-z不仅仅是字母匹配)

编辑:看后面不起作用,因为它不允许可变大小的匹配。为可能的\/?结尾

添加了/

答案 1 :(得分:1)

我认为你的判断会更好 (?=.*[A-Za-z]+.*\.[A-Za-z]+/?$)

使用它和一些重构,这个原始正则表达式验证和无效 样品中的正确项目。

^(https?://)(?=.*[A-Za-z]+.*\.[A-Za-z]+/?$)((?:[A-Za-z0-9]+(?:-+[A-Za-z0-9]+)?\.)+)([A-Za-z]+)/?$

Formatted and tested:

 ^ 
 ( https?:// )                 # (1)
 (?= .* [A-Za-z]+ .* \. [A-Za-z]+ /? $ )
 (                             # (2 start)
      (?:
           [A-Za-z0-9]+ 
           (?:
                -+
                [A-Za-z0-9]+ 
           )?
           \.
      )+
 )                             # (2 end)
 ( [A-Za-z]+ )                 # (3)
 /?
 $