这个正则表达式匹配,不应该.为什么?

tsi*_*ilb 5 regex

这个正则表达式:

^((HTTPS | FTP)\:(\ /\/)|(文件\:\/{2,3}))(((25 [0-5] | 2 [0-4] - [O- 9] | [01]?[0-9] [0-9]?)\.){3}(25 [0-5] | 2 [0-4] [0-9] | [01]?[ 0-9] [0-9]?))|(((([[ - zA-Z0-9] +)(\.)?)+?)(\.)([az] {2} | com |组织|网络| GOV |万|企业|资讯|牧高笛|名称|航空|人才招聘|?博物馆))([?A-ZA-Z0-9\\ = \&\%\ /]*)$

格式化可读性:

^( # Begin regex / begin address clause
  (https?|ftp)\:(\/\/)|(file\:\/{2,3}))? # protocol
  ( # container for two address formats, more to come later
   ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
   (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) # match IP addresses
  )|( # delimiter for address formats
   ((([a-zA-Z0-9]+)(\.)?)+?) # match domains and any number of subdomains
   (\.) #dot for .com
   ([a-z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum) #TLD clause
  ) # end address clause
([a-zA-Z0-9\?\=\&\%\/]*)? # querystring support, will pretty this up later
$
Run Code Online (Sandbox Code Playgroud)

匹配:

www.google

而且不应该.这是我的"失败"测试用例之一.我已经声明,当在alpha上而不是在IP上匹配时,URL的TLD部分是必需的,并且"google"不适合"[az] {2}"子句.

请记住,我将单独解决以下问题 - 这个问题是关于为什么它与www.google匹配而不应该.

  • Querystring只需要支持正确的格式,目前接受任何querystring字符组合
  • 虽然我的要求范围可能不包括它们,但不支持几种协议
  • 不包含3个字符的不常见顶级域名
  • 可能匹配http://www.google..com - 将检查连续点
  • 不支持十进制IP地址格式

我的正则表达式有什么问题?

编辑:另请参阅另一个测试用例中此正则表达式的早期版本的上一个问题: 如何正确地使此正则表达式匹配?



edit2:已修复 - 更正后的正则表达式(如提出的那样)是:

^((HTTPS | FTP)\:(\ /\/)|(文件\:\/{2,3}))(((25 [0-5] | 2 [0-4] - [O- 9] | [01]?[0-9] [0-9]?)\.){3}(25 [0-5] | 2 [0-4] [0-9] | [01]?[ 0-9] [0-9]))|(((([A-ZA-Z0-9] +)(\).?)+)(\)([AZ] {2} |?.com |组织|网络| GOV |万|企业|资讯|牧高笛|名称|航空|人才招聘|博物馆))([\ /] [\/A-ZA-Z0-9 \.]*)*([\ /? ] [\?] [A-ZA-Z0-9\= \&\%\ /]*)?$

Amb*_*ber 12

"谷歌"可能不适合[a-z]{2},但它确实适合[a-z]{2}([a-zA-Z0-9\?\=\&\%\/]*)?- /如果URL超出域名,您忘记要求在TLD之后.所以它用"www.go"作为域解释它,然后"ogle"跟随它,之间没有斜线.您可以通过[?/]在最后一个组的前面添加一个来修复它,以便在TLD和URL的任何其他部分之间要求这两个符号之一.