代码之家  ›  专栏  ›  技术社区  ›  Dai

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

  •  2
  • Dai  · 技术社区  · 6 年前

    我正在用C语言编写一个快速实用程序来修改我的所有Visual Studio C项目模板以添加额外的 using ; 声明。我已经编写了一个简单的正则表达式(hackishly)来提取每个文件中当前名称空间导入的集合,这样我就可以添加所需的新导入而不需要重复。

    Regex101.com 在将正则表达式插入C程序之前测试它们,但在C程序中测试它们时,它们不起作用。这让我很困惑,因为regex本身很琐碎,它使用了.NET和ECMAScript正则表达式所共有的regex约定 它也失败了,即使 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 回复  |  直到 6 年前
        1
  •  2
  •   Poul Bak    6 年前

    这是由于多行模式中的“$”与 \n '不是' \r\n ,这是Windows上的默认换行符。解决方法是简单地添加' \r? '在前面' $

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

    现在它将匹配两个' \不 '和' '.

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