我正在尝试匹配看起来像这样的字符串:
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>
关于我做错了什么或如何解决它的任何想法?
答案 0 :(得分:4)
我正等着其中一个真正回答这个问题的人在这里弹出答案,但由于他们没有,我会把它扔进去。
我不是确切地确定出了什么问题,但事实证明,在.NET中,我需要用\b*
替换\s*
。 \s*
似乎不适用于其他RegEx引擎(我只进行了一些测试),但它确实可以与.NET一起使用。我在\b
周围阅读的文档会让我相信它应该匹配一个单词的空白,但也许我误会了,或者也许有些奇怪的东西围绕捕获不同的引擎处理不同的东西
无论如何,这是我最后的RegEx:
(?<!["'>]\s*)((https?:\/\/)([A-Za-z0-9_=%&@\?\.\/\-]+))\b
我不明白出了什么问题,足以为这个改变的原因提供任何真实的背景,而且我不喜欢RegExes,我不能完全证明时间搞清楚,但也许它会帮助某人否则最终: - )。