【发布时间】:2009-10-25 23:19:44
【问题描述】:
鉴于此正则表达式:
^((https?|ftp):(\/{2}))?(((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]?))|(((([a-zA-Z0-9]+)(\.)*?))(\.)([a-z]{2}
|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum){1})
重新格式化以提高可读性:
@"^((https?|ftp):(\/{2}))?" + // http://, https://, ftp:// - Protocol Optional
@"(" + // Begin URL payload format section
@"((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]?)" + // IPv4 Address support
@")|("+ // Delimit supported payload types
@"((([a-zA-Z0-9]+)(\.)*?))(\.)([a-z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum){1}" + // FQDNs
@")"; // End URL payload format section
如何让它在这个“失败”测试用例中失败(即不匹配)?
http://www.google
当我在 TLD 部分指定 {1} 时,我认为如果没有扩展名它会失败。我错了吗?
编辑:这些是我的 PASS 条件:
- "http://www.zi255.com?Req=Post&PID=4",
- "http://www.zi255.com?Req=Post&ID=4",
- "http://www.zi255.com/?Req=Post&PID=4",
- "http://www.zi255.com?Req=Post&PostID=4",
- “http://www.zi255.com/?Req=Post&ID=4”
- "http://www.zi255.com?Req=Post&Post=4",
- "http://www.zi255.com?Req=Post&Entry=4",
- “http://www.zi255.com?PID=4”
- "http://www.zi255.com/Post.aspx?Req=Post&ID=4",
- "http://www.zi255.com/Post.aspx?Req=Post&PID=4",
- "http://www.zi255.com/Post.aspx?Req=Post&Post=4",
- “http://www.zi255.com/Post.aspx?Req=Post&Title=Random%20Post%20Name”
- "http://www.zi255.com/?Req=Post&Title=Random%20Post%20Name",
- "http://www.zi255.com?Req=Post&Title=Random%20Post%20Name",
- "http://www.zi255.com?Req=Post&PostID=4",
- "http://www.zi255.com?Req=Post&Post=4",
- "http://www.zi255.com?Req=Post&Entry=4",
- “http://www.zi255.com?PID=4”
- "http://www.zi255.com",
- “http://www.damnednice.com”
这些是我的失败条件:
- "http://.com",
- "http://.com/",
- “http:/www.google.com”,
- “http:/www.google.com/”,
- "http://www.google",
- "http://www.googlecom",
- "http://www.google.c",
- ".com",
- "https://www..."
【问题讨论】:
-
那个正则表达式是病态的。 C# 没有 URL 验证机制吗?我知道PHP可以。这也是对有效 URL 的不完整检查(例如,有限的 TLD,1000000000 是点符号的替代方法,用户名的使用(可选密码)等)。这个复杂的正则表达式真的有必要吗?
-
您的正则表达式也无法匹配un.int。 :)
-
@Cletus:谷歌搜索显示 C# 中的大多数 URL 验证都是通过正则表达式完成的。
-
@Greg:根据regextester.com,它确实匹配 un.int,尽管当我查看 TLD 部分中的 {2} 时这让我感到困惑......奇怪......
-
非美国网址怎么样 *.co.uk *.com.au 等