相同内容上的相同正则表达式返回 3 个不同的结果,按环境区分

问题描述

这是一段代码

        
var content = @"Script 1 Line 1;
GO
Script 1 Line 2;
GO
";
        
var regex = new Regex("^GO$",RegexOptions.Multiline);
MatchCollection mc = regex.Matches(content);
Debug.WriteLine(mc.Count);

当我在 Roslyn 或 Framework 4.7.2 的“dotnetfiddle.com”中运行此代码时 - 结果相同 - 2 matches

当我在单元测试项目中运行此代码时,直接在框架 4.7.2 中的 TestMethod - 0 matches

当我在针对 netstandard2.0 编译的项目中的类方法中运行此代码时, - 1 match

这是我需要解决一个主要问题

附加测试

var sb = new StringBuilder();
sb.AppendLine("Script 1 Line 1;");
sb.AppendLine("GO");
sb.AppendLine("Script 1 Line 2;");
sb.AppendLine("GO");
sb.AppendLine();
var content = sb.ToString();
        
Console.WriteLine(content);
// ^^^ changed string creation ^^^
var regex = new Regex("^GO$",RegexOptions.Multiline);
MatchCollection mc = regex.Matches(content);
Console.WriteLine(mc.Count);

有了这个^^^,即使是“dotnetfiddle.com”也返回0 matches

我仍然没有得到这里的图片,但显然是关于不同编辑器中的换行符。那为什么字符串生成器要这样做呢?

解决方法

在 MSDN(https://docs.microsoft.com/en-us/dotnet/standard/base-types/anchors-in-regular-expressions?redirectedfrom=MSDN) 中,它指出:

如果您将 $ 与 RegexOptions.Multiline 选项一起使用,匹配也可以出现在行尾。请注意,$ 匹配\n 但不匹配\r\n(回车和换行符的组合,或CR/LF)。要匹配 CR/LF 字符组合,请在正则表达式模式中包含 \r?$。

当我在 Visual Studio 中打印 content 的每个字节时,结果是

83 99 114 105 112 116 32 49 32 76 105 110 101 32 49 59 13 10 71 79 13 10 83 99 114 105 112 116 32 49 32 76 105 110 101 32 50 59 13 10 71 79 13 10 带回车。它与 GO 不匹配。

在 dotnetfiddle.com 和 python 中,结果是

83 99 114 105 112 116 32 49 32 76 105 110 101 32 49 59 10 71 79 10 83 99 114 105 112 116 32 49 32 76 105 110 101 32 50 59 10 71 79 10 没有回车。它匹配 GO。

当我在 dotnetfiddle 中使用 StringBuilder 时,结果是

83 99 114 105 112 116 32 49 32 76 105 110 101 32 49 59 13 10 71 79 13 10 83 99 114 105 112 116 32 49 32 76 105 110 101 32 50 59 13 10 71 79 13 10 13 10 带回车。它与 GO 不匹配。

因此将 ^GO$ 更改为 ^GO\r?$ 将使它起作用。