已更正範圍的 Regex 模式
Regex 在 .NET Framework 和 .NET 6 和舊版中,不正確地處理某些範圍的大小寫。 .NET 7 中已修正此錯誤。
如果規則運算式有因為這個錯誤而隱藏的錯誤,或如果您實作因應措施來解決此錯誤,則此錯誤的修正可能會造成中斷性變更。
先前的行為
在 .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
中斷性變更的類型
此變更為行為變更。
變更原因
先前的行為不正確。
建議的動作
如果規則運算式有隱藏的錯誤,請加以修正。 如果您有此錯誤的因應措施,您可以移除該因應措施。
受影響的 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