正则表达式:检查重复组是否至少包含一次字母

Regexp: check if repeated group contains a letter at least once

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

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

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

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,}

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

您的想法是对的,但是,正如您所说,您不希望超前考虑顶级域名。因此,在您的展望中包含该匹配项的副本:

(?=.*[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 不仅匹配字母)

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

添加了 \/?

我认为这个断言会让你过得更好
(?=.*[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)
 /?
 $