我正在用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中失败:
答案 0 :(得分:2)
这是由于以下事实造成的:多行模式中的“ $”与“ \n
”而不是“ \r\n
”匹配,这是Windows上的默认换行符。解决方案就是简单地在“ \r?
”换行符前添加“ $
”,如下所示:
^using ([\w\.]+);\r?$
现在它将同时匹配“ \n
”和“ \r\n
”。
修改:
当您在RegEx101上输入多行文本时,他们使用'\ n'作为换行符,这就是为什么它在其网站上有效的原因。