Я думаю, что это достаточно отличается от похожих вопросов, чтобы оправдать новый.
У меня есть следующее регулярное выражение для сопоставления начинающих тегов гиперссылок в HTML, включая часть http (s): // во избежание mailto: links
<a[^>]*?href=[""'](?<href>\\b(https?)://[^\[\]""]+?)[""'][^>]*?>
Когда я запускаю это через Nregex (с удаленным экранированием), оно соответствует правильно для следующих тестовых случаев:
<a href="http://www.bbc.co.uk">
<a href="http://bbc.co.uk">
<a href="https://www.bbc.co.uk">
<a href="mailto:rory@domain.com">
Однако, когда я запускаю это в своем коде C #, это не получается. Вот соответствующий код:
public static IEnumerable<string> GetUrls(this string input, string matchPattern)
{
var matches = Regex.Matches(input, matchPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
foreach (Match match in matches)
{
yield return match.Groups["href"].Value;
}
}
И мои тесты:
@"<a href=""https://www.bbc.co.uk"">bbc</a>".GetUrls(StringExtensions.HtmlUrlRegexPattern).Count().ShouldEqual(1);
@"<a href=""mailto:rory@domain.com"">bbc</a>".GetUrls(StringExtensions.HtmlUrlRegexPattern).Count().ShouldEqual(0);
Проблема, похоже, в добавленной мной части \\b(https?)://
, удаление которой проходит обычный тест URL, но не проходит mailto: test.
Кто-нибудь пролил свет?