[英]How can I make this regex match correctly?
鉴于此正则表达式:
^((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}时,我认为如果没有扩展名它将失败。 我错了吗?
编辑:这些是我的通过条件:
这些是我的失败条件:
我会提出另一个建议。 您可能需要结合使用内置System.Uri
类的解析和几个目标正则表达式(或在适当时进行简单的字符串检查)。
例:
string uriString = "...";
Uri uri;
if (!Uri.TryCreate(uriString, UriKind.Absolute, out uri))
{
// Uri is totally invalid!
}
else
{
// validate the scheme
if (!uri.Scheme.Equals("http", StringComparison.OrdinalIgnoreCase))
{
// not http!
}
// validate the authority ('www.blah.com:1234' portion)
if (uri.Authority // ...)
{
}
// ...
}
有时,一个万能的reqex不是最佳解决方案,但是很诱人。 尽管调试此正则表达式是可行的(请参阅Greg Hewgills的答案),但请考虑针对不同类别的问题进行一些测试,例如,针对数字地址的一项测试和针对命名地址的一项测试。
您需要强制正则表达式匹配直到字符串的末尾。 在其末尾添加一个$
。 否则,您的正则表达式可能只匹配http://
,或者比整个字符串短的其他内容。
“验证网址”问题已被解决*很多次。 我建议您使用System.Uri
类,它可以验证更多的案例,而不用您动摇。
代码Uri uri = new Uri(" http://whatever ");
如果验证失败,则抛出UriFormatException
。 那可能就是您想要的。
*)或某种解决。 定义什么是有效的URL实际上非常棘手。
有关定义的所有信息,“有效网址”应在您执行DNS查找时为您提供IP地址。 该IP应该已连接,并且在发送请求时,您会收到可以使用的HTML信息形式的答复。
因此,我们正在寻找一种“有效的URL格式”,这就是system.uri
派上用场的地方。 但是,如果URL隐藏在很大的tekst中,则您首先要查找可以验证为有效URL格式的内容。
区别于任何给定的可读tekst的URL的原因是点号后面没有空格。 “ 123.com”可以验证为真实网址。
使用正则表达式
[a-z_\.\-0-9]+\.[a-z]+[^ ]*
查找文本中任何可能的有效url,然后执行system.uri检查以查看其是否为有效的URL格式,然后进行查找。 仅当查找为您提供结果时,您才知道URL有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.