【发布时间】:2019-05-13 14:32:30
【问题描述】:
我正在构建一个可以匹配 url 的网站验证器正则表达式。
问题是,它 90% 有效!它进出我的字符串匹配,这就是问题所在。
我的正则表达式:(http(s?)://www.|www.|http(s?)://)+[a-z0-9]+([-.]{1} [a-z0-9]+).[a-z]{2,5}(:[0-9]{1,5})?(/.)?
我要测试的字符串:
1)(这应该失败,但它通过了) https://www.xy
2)(这应该通过,它确实通过了)https://www.xy.com
它不断进入我的组 (http(s?)://) 而不是组 ((http(s?)://www.)
你知道如何解决这个问题吗?
我要传递的网址:
我想失败的网址: http://www.bla https://www.ggg
所以,如果它匹配https://www。或http://www。它应该使用正确的组,然后应用正则表达式的其余部分来检查它是否包含.. test.com 等。
【问题讨论】:
-
如果
bla和ggg是现有的TLD,http://www.bla和https://www.ggg将是正确的URL。例如,https://www.gg或https://www.xyz是正确的 URL -
您很可能希望转义
[a-z]{2,5}之前的.,以便它只匹配实际的点而不是任何字符(但正如 @Seblor 所说,这仍然会使 URL 验证器变得很差) -
如果您使用支持所有格量词的正则表达式实现,
https?://(?:www.)?+[a-z0-9]+\.[a-z]{2,5}(:[0-9]{1,5})?(/.)?看起来可以满足您的需求。如果您使用支持负前瞻的正则表达式实现,https?://(?:www.)?(?!www)[a-z0-9]+\.[a-z]{2,5}(:[0-9]{1,5})?(/.)?也会这样做(两者都确保[a-z0-9]+与www不匹配) -
我注意到我的正则表达式中有两个错误:1)在两个正则表达式中,
(?:www.)中的.应该被转义; 2)在第二个正则表达式中,负前瞻也应该匹配.(也转义),这样它就不会阻止匹配http://wwwaaahhhooo.com
标签: regex