RegEx不适用于.NET,但适用于其他RegEx实现

时间:2013-09-26 06:13:02

标签: c# html .net regex

我正在尝试匹配看起来像这样的字符串:

http://www.google.com

但如果它发生在更大的上下文中,请不要这样:

<a href="http://www.google.com"> 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="http://www.google.com">http://www.google.com</a>

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

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

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

1 个答案:

答案 0 :(得分:4)

我正等着其中一个真正回答这个问题的人在这里弹出答案,但由于他们没有,我会把它扔进去。

我不是确切地确定出了什么问题,但事实证明,在.NET中,我需要用\b*替换\s*\s*似乎不适用于其他RegEx引擎(我只进行了一些测试),但它确实可以与.NET一起使用。我在\b周围阅读的文档会让我相信它应该匹配一个单词的空白,但也许我误会了,或者也许有些奇怪的东西围绕捕获不同的引擎处理不同的东西

无论如何,这是我最后的RegEx:

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

我不明白出了什么问题,足以为这个改变的原因提供任何真实的背景,而且我不喜欢RegExes,我不能完全证明时间搞清楚,但也许它会帮助某人否则最终: - )。