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>

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

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

我一直在等待最初实际回答这个问题的人之一在这里弹出答案,但由于他们没有,我会把它扔进去。

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

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

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

我不明白出了什么问题,无法为为什么这个变化有效提供任何真正的背景,而且我非常不喜欢 RegExes,以至于我不能完全证明弄清楚它的时间是合理的,但也许它最终会帮助其他人:-(。