更正了范围的正则表达式模式

正则表达式在 .NET Framework 和 .NET 6 及更早版本中错误地处理了某些范围的大小写。 此 bug 在 .NET 7 中已修复。

如果正则表达式由于存在此 bug 而将 bug 隐藏,或者你实施了对此 bug 的解决方法,则此 bug 的修复可能会导致中断性变更。

旧行为

在 .NET 6 及更早版本中,以下两种模式会产生不同的结果。 但是,它们应生成相同的结果(false),因为范围 \xD7-\xD8 只包括值 \xD7\xD8 本身。

// Evaluates to false.
Regex.IsMatch("\xF7", @"^(?i:[\xD7\xD8])$", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
// Evaluates to true.
Regex.IsMatch("\xF7", @"^(?i:[\xD7-\xD8])$", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);

新行为

从 .NET 7 开始,示例模式均评估为 false

// Evaluates to false.
Regex.IsMatch("\xF7", @"^(?i:[\xD7\xD8])$", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
// Evaluates to false.
Regex.IsMatch("\xF7", @"^(?i:[\xD7-\xD8])$", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);

引入的版本

.NET 7

中断性变更的类型

此更改为行为更改

更改原因

之前的行为不正确。

如果正则表达式存在隐藏的 bug,请修复它。 如果此 bug 已有一个解决方法,则可以删除该解决方法。

受影响的 API