琐碎的多行正则表达式在.NET中失败,但在ECMAScript中成功-为什么?

时间:2018-09-17 05:02:12

标签: javascript .net regex

我正在用C#编写一个快速实用程序,以修改我的所有Visual Studio C#项目模板,以添加额外的using ;语句。我编写了一个简单的正则表达式来(恶意地)提取每个文件中的当前名称空间导入集,以便我可以不重复地添加所需的新导入。

我正在使用Regex101.com测试正则表达式,然后再将其插入到C#程序中,但是当我在C#程序中对其进行测试时,它们将无法工作。这让我感到困惑,因为正则表达式本身很简单,它使用了.NET和ECMAScript正则表达式 通用的正则表达式约定,即使使用了RegexOptions.ECMAScript兼容性选项,它也失败了。

const String input = @"using System;
using System.Foo;

using Foo.Bar;

namespace Foo
{
    using Baz;

    class Qux
    {

    }
}";

Regex regex = new Regex( @"^using ([\w\.]+)\;$", RegexOptions.Multiline | RegexOptions.ECMAScript );

Match match = regex.Match( input );

Assert.IsTrue( match.Success ); // `match.Success` is false when I run this code

我不明白为什么,因为\w^$和多行选项的行为在两个平台上表面上是相同的。

下面是一个截图,显示它在Regex101.com中成功运行:

enter image description here

下面是一个截图,显示它在.NET中失败:

enter image description here

1 个答案:

答案 0 :(得分:2)

这是由于以下事实造成的:多行模式中的“ $”与“ \n”而不是“ \r\n”匹配,这是Windows上的默认换行符。解决方案就是简单地在“ \r?”换行符前添加“ $”,如下所示:

^using ([\w\.]+);\r?$

现在它将同时匹配“ \n”和“ \r\n”。

修改

当您在RegEx101上输入多行文本时,他们使用'\ n'作为换行符,这就是为什么它在其网站上有效的原因。