RegEx 不适用于 .NET,但适用于其他 RegEx 实现
本文关键字:RegEx 适用于 其他 实现 NET 不适用 | 更新日期: 2023-09-27 18:32:47
我正在尝试匹配如下所示的字符串:
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
问题是该特定的正则表达式似乎在 .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>
关于我做错了什么或如何解决它的任何想法?
我一直在等待最初实际回答这个问题的人之一在这里弹出答案,但由于他们没有,我会把它扔进去。
我不确定出了什么问题,但事实证明,在 .NET 中,我需要用 's*
替换'b*
。该's*
似乎不适用于其他正则表达式引擎(我只做了一点测试(,但它确实可以与 .NET 正常工作。我读过的文档'b
让我相信它也应该匹配导致单词的空格,但也许我误解了,或者不同的引擎处理方式不同,捕获有一些奇怪之处。
无论如何,这是我的最终正则表达式:
(?<!["'>]'s*)((https?:'/'/)([A-Za-z0-9_=%&@'?'.'/'-]+))'b
我不明白出了什么问题,无法为为什么这个变化有效提供任何真正的背景,而且我非常不喜欢 RegExes,以至于我不能完全证明弄清楚它的时间是合理的,但也许它最终会帮助其他人:-(。