1

我知道有很多用于 URL 等的正则表达式,但我真的很难理解为什么这个不能工作。我试图确保用户的条目是正确的网站,允许 www 与否。

var pattern = 
/http(s?):\/\/                      (http:// or https://)
(?:[a-zA-Z]+\.){0,1}                (0 or 1 instance of www)
(?:[a-zA-Z0-9][a-zA-Z0-9-]+){1}     (1 instance of a domain name)
(?:\.[a-zA-Z]{2,6})+/;              (1 or more instance of .com or .co.uk)

它适用于以下使用 pattern.test() 的测试用例

然而,即使我明确告诉正则表达式它必须匹配 .com 或 .co.uk 等,它也允许我写这样的废话:

我一直在绞尽脑汁尝试不同的组合,但我能理解为什么即使我明确说必须有一个或多个域扩展,那部分似乎并不重要?

干杯

4

1 回答 1

4

如果您尝试验证字符串,则需要将其锚定到字符串的开头和结尾:

var pattern = 
/^http(s?):\/\/                      (http:// or https://)
(?:[a-zA-Z]+\.){0,1}                (0 or 1 instance of www)
(?:[a-zA-Z0-9][a-zA-Z0-9-]+){1}     (1 instance of a domain name)
(?:\.[a-zA-Z]{2,6})+$/;              (1 or more instance of .com or .co.uk)

因为www.stackoverflow,第一组不匹配(因为你说它是可选的),然后第二组匹配www,第三组匹配.stacko

提示:

  • {1}没有必要
  • {0,1}相当于?
  • 由于您没有使用任何捕获,(s?)因此可能只是s?
于 2013-09-08T23:13:12.203 回答