这个正则表达式:
^((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匹配的原因,不应该。
我的正则表达式出了什么问题?
编辑:在另一个测试用例中,请参阅此正则表达式的早期版本的上一个问题: 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 \ = \&安培; \%\ /]?* )?$
答案 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 \?\ = \& \%/] *)?”