我已尝试使用自己的,并在StackOverflow上使用顶部的,但大多数匹配的次数超出了预期。
例如,有些人会从输入http://foo.com/hello?world<br
中提取<br
(注释...http://foo.com/hello?world<br>...
)。
如果有一种模式可以更可靠地匹配URL吗?
这是我正在使用的当前模式:
@"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&^]*)"
答案 0 :(得分:3)
最安全的正则表达式是完全不使用正则表达式并使用System.Uri类。
Uri uri = new Uri("http://myUrl/%2E%2E/%2E%2E");
Console.WriteLine(uri.AbsoluteUri);
Console.WriteLine(uri.PathAndQuery);
答案 1 :(得分:0)
你的正则表达式需要在最后一个字符组中使用短划线“ - ”:
@"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+\-=\\\.&^]*)"
基本上,你允许使用+到=的字符,其中包括&lt;
答案 2 :(得分:0)
试试这个:
public static string[] Parse(string pattern, string groupName, string input)
{
var list = new List<string>();
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
for (var match = regex.Match(input); match.Success; match = match.NextMatch())
{
list.Add(string.IsNullOrWhiteSpace(groupName) ? match.Value : match.Groups[groupName].Value);
}
return list.ToArray();
}
public static string[] ParseUri(string input)
{
const string pattern = @"(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*";
return Parse(pattern, string.Empty, input);
}