Ken*_*ith 12 .net html c# regex
我正在尝试匹配看起来像这样的字符串:
http://www.google.com
Run Code Online (Sandbox Code Playgroud)
但是如果它发生在更大的上下文中,就像这样:
<a href="http://www.google.com"> http://www.google.com </a>
Run Code Online (Sandbox Code Playgroud)
我得到的正则表达式在我测试过的几个不同的RegEx引擎(PHP,ActionScript)中的工作如下所示:
(?<!["'>]\b*)((https?://)([A-Za-z0-9_=%&@?./-]+))\b
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到它: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;
}
Run Code Online (Sandbox Code Playgroud)
具体来说,.NET似乎没有关注第一个\b*.换句话说,它正确无法匹配此字符串:
<a href="http://www.google.com">http://www.google.com</a>
Run Code Online (Sandbox Code Playgroud)
但它错误地匹配此字符串(请注意额外的空格):
<a href="http://www.google.com"> http://www.google.com </a>
Run Code Online (Sandbox Code Playgroud)
关于我做错了什么或如何解决它的任何想法?
我正在等待最初回答这个问题的人之一将答案放在这里,但既然他们没有,我就把它扔进去。
我不太确定出了什么问题,但事实证明,在 .NET 中,我需要\b*将\s*. 它\s*似乎不适用于其他 RegEx 引擎(我只做了一点测试),但它确实可以与 .NET 一起正常工作。我读过的文档\b会让我相信它也应该匹配单词前面的空格,但也许我误解了,或者不同的引擎处理不同的捕获有一些奇怪的地方。
无论如何,这是我的最终正则表达式:
(?<!["'>]\s*)((https?:\/\/)([A-Za-z0-9_=%&@\?\.\/\-]+))\b
Run Code Online (Sandbox Code Playgroud)
我不太明白出了什么问题,无法给出任何真正的背景来解释为什么这个改变有效,而且我非常不喜欢正则表达式,以至于我无法证明花时间弄清楚它是合理的,但也许它最终会帮助其他人: -)。