我正在学习正则表达式并且有一个任务来创建表达式来验证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,}
但它检查整个表达式直到结束,即它也检查顶级域名。我该如何解决这个问题?
答案 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]+)/?$
^
( https?:// ) # (1)
(?= .* [A-Za-z]+ .* \. [A-Za-z]+ /? $ )
( # (2 start)
(?:
[A-Za-z0-9]+
(?:
-+
[A-Za-z0-9]+
)?
\.
)+
) # (2 end)
( [A-Za-z]+ ) # (3)
/?
$