更正了范围的正则表达式模式
正则表达式在 .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
- System.Text.RegularExpressions.Regex.Count
- System.Text.RegularExpressions.Regex.EnumerateMatches
- System.Text.RegularExpressions.Regex.IsMatch
- System.Text.RegularExpressions.Regex.Match
- System.Text.RegularExpressions.Regex.Matches
- System.Text.RegularExpressions.Regex.Replace
- System.Text.RegularExpressions.Regex.Split