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

时间:2009-10-27 09:06:18

标签: 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]?))|(((([A-ZA-Z0-9 ] +)(\。)?)+?)(\)([AZ] {2} | COM |有机|净| GOV |密耳| BIZ |信息|摩比|名称|航空|工作|博物馆))([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
$

匹配:

www.google

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

请记住,我会单独解决以下问题 - 这个问题是关于它与www.google匹配的原因,不应该。

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

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

编辑:在另一个测试用例中,请参阅此正则表达式的早期版本的上一个问题: How can I make this regex match correctly?



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 \ = \&安培; \%\ /]?* )?$

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:2)

您的TLD子句与Google中的“go”匹配,而查询字符串支持部分则匹配“ogle”。尝试将查询字符串部分更改为:

([?/][a-zA-Z0-9\?\=\&\%\/]*)?

答案 2 :(得分:2)

  

google“不符合”[a-z] {2}“条款。

但“go”确实然后“ogle”匹配“([a-zA-Z0-9 \?\ = \& \%/] *)?”