如何解决相同内容上的相同正则表达式返回 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?$
将使它起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。