我正在用 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 中成功的屏幕截图:
下面的屏幕截图显示它在 .NET 中失败:
最佳答案
这是由于多行模式下的“$”匹配“\n
”,而不是默认换行符“\r\n
”在 Windows 上。解决方案很简单,在“$
”换行符前面添加“\r?
”,如下所示:
^using ([\w\.]+);\r?$
现在它将匹配“\n
”和“\r\n
”。
编辑:
当您在 RegEx101 上输入多行文本时,他们使用“\n”作为换行符,这就是它在他们的网站上运行的原因。
关于javascript - 简单的多行正则表达式在 .NET 中失败,但在 ECMAScript 中成功 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52361025/