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

Posted

技术标签:

【中文标题】RegEx 不适用于 .NET,但适用于其他 RegEx 实现【英文标题】:RegEx doesn't work with .NET, but does with other RegEx implementations 【发布时间】:2013-10-01 23:21:48 【问题描述】:

我正在尝试匹配如下所示的字符串:

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>

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

【问题讨论】:

您的正则表达式链接中没有替换或匹配...而且您不应该将量词放在单词边界上。在 .NET 中(我在这里考虑 C#),您必须用双引号转义双引号,以便 " 变为 "" @Jerry - 是的,我在我的实际 C# 代码中做所有这些 - 已编辑。 我记得使用过一些 RE 工具,他们可以选择执行 RE 的引擎。有一个 .Net 引擎,因为它以不同的方式执行 RE。 @SoMoS - 同意,他们显然这样做了。我在myregextester.com/index.php 对其进行了测试,它显示它在 PHP 下工作,但在 .NET 下失败(就像我自己的测试一样)。 @KenSmith \b 匹配位置而不是字符。如果你想断言http 左边没有["'&gt;],但忽略中间的空格,那么\s* 是要走的路。如果这是您的意图,我可以投票取消删除答案(我相信它已被删除,因为我指出该建议背后的推理不正确) 【参考方案1】:

我一直在等待一个真正最初回答这个问题的人在这里弹出答案,但既然他们没有,我就把它扔进去。

我不确定准确出了什么问题,但事实证明,在 .NET 中,我需要将 \b* 替换为 \s*\s* 似乎不能与其他 RegEx 引擎一起使用(我只做了一点测试),但它确实可以在 .NET 上正常工作。我在\b 周围阅读的文档会让我相信它也应该匹配导致单词的空格,但也许我误解了,或者不同引擎处理不同的捕获存在一些奇怪之处。

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

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

我不明白哪里出了问题,无法提供任何真实背景来解释为什么这种变化有效,而且我不喜欢 RegExes,以至于我无法证明花时间解决这个问题是合理的,但也许它会对某人有所帮助否则最终:-)。

【讨论】:

以上是关于RegEx 不适用于 .NET,但适用于其他 RegEx 实现的主要内容,如果未能解决你的问题,请参考以下文章

RegEx 替换适用于 Ruby gsub,但不适用于 sed

正则表达式适用于 regex101.com,但不适用于 prod

正则表达式适用于 regex101.com,但不适用于 prod

Python3 正则表达式不适用于脚本,但适用于 pythex.org

为啥这个 CSS 不适用于 Android 上的 Chrome,但适用于其他任何地方?

Materialise Sidenav 不适用于 iOS 或 iPhone,但适用于所有其他设备