Я пытаюсь сопоставить строки, которые выглядят так:
http://www.google.com
Но если это происходит в более широком контексте, например:
<a href="#" onclick="location.href='http://www.google.com'; return false;"> http://www.google.com </a>
У меня есть регулярное выражение, которое выполняет эту работу в нескольких разных версиях RegEx, которые я тестировал (PHP, ActionScript) выглядит следующим образом:
(?<!["'>]\b*)((https?://)([A-Za-z0-9_=%&@?./-]+))\b
Вы можете увидеть, как он работает здесь: http://regexr.com?36g0e
Проблема в том, что данный RegEx не работает корректно в .NET.
private static readonly Regex fixHttp = new Regex(@"(?<![""'>]\b*)((https?://)([A-Za-z0-9_=%&@?./-]+))\b", RegexOptions.IgnoreCase);
private static readonly Regex fixWww = new Regex(@"(?<=[\s])\b((www\.)([A-Za-z0-9_=%&@?./-]+))\b", RegexOptions.IgnoreCase);
public static string FixUrls(this string s)
{
s = fixHttp.Replace(s, "<a href=\"$1\">$1</a>");
s = fixWww.Replace(s, "<a href=\"http://$1\">$1</a>");
return s;
}
В частности,.NET, похоже, не обращает внимания на первый \b*
. Другими словами, он правильно не соответствует этой строке:
<a href="#" onclick="location.href='http://www.google.com'; return false;">http://www.google.com</a>
Но он неправильно соответствует этой строке (обратите внимание на дополнительные пробелы):
<a href="#" onclick="location.href='http://www.google.com'; return false;"> http://www.google.com </a>
Любые идеи относительно того, что я делаю неправильно или как это работает?