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
左边没有["'>]
,但忽略中间的空格,那么\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