12

我正在尝试匹配如下所示的字符串:

http://www.google.com

但如果它发生在像这样的更大的上下文中,则不会:

<a href="http://www.google.com"> http://www.google.com </a>

我得到的正则表达式在我测试过的几个不同的正则表达式引擎(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="http://www.google.com">http://www.google.com</a>

但它错误地匹配了这个字符串(注意额外的空格):

<a href="http://www.google.com"> http://www.google.com </a>

关于我做错了什么或如何解决它的任何想法?

4

1 回答 1

4

我一直在等待一个真正最初回答这个问题的人在这里弹出答案,但既然他们没有,我会把它扔进去。

我不确定出了什么问题,但事实证明,在 .NET 中,我需要将 .NET 替换\b*\s*. \s*似乎不适用于其他 RegEx 引擎(我只做了一点测试),但它确实适用于 .NET 。我读过的文档\b会让我相信它也应该匹配导致单词的空格,但也许我误解了,或者不同引擎处理不同的捕获有一些奇怪之处。

无论如何,这是我最后的正则表达式:

(?<!["'>]\s*)((https?:\/\/)([A-Za-z0-9_=%&@\?\.\/\-]+))\b

我不明白出了什么问题,无法给出任何真实背景来解释为什么这种变化有效,而且我不喜欢 RegExes,以至于我无法证明花时间弄清楚它是合理的,但也许它最终会帮助其他人: -)。

于 2013-09-27T17:10:34.197 回答