Wzorce wyrażeń regularnych z poprawionymi zakresami
Funkcja Regex niepoprawnie obsługuje wielkość liter niektórych zakresów w programie .NET Framework i na platformie .NET 6 i starszych wersjach. Ta usterka została usunięta na platformie .NET 7.
Poprawka tej usterki może spowodować zmianę powodującą niezgodność, jeśli wyrażenie regularne zawiera usterkę ukrytą z powodu tej usterki lub jeśli zaimplementowano obejście tego błędu.
Poprzednie zachowanie
W przypadku platformy .NET 6 i starszych wersji następujące dwa wzorce generują różne wyniki. Powinny jednak wygenerować ten sam wynik (false
), ponieważ zakres \xD7-\xD8
zawiera tylko wartości \xD7
i \xD8
same.
// 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);
Nowe zachowanie
Począwszy od platformy .NET 7, przykładowe wzorce są obliczane na wartość 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);
Wprowadzona wersja
.NET 7
Typ zmiany powodującej niezgodność
Ta zmiana jest zmianą behawioralną.
Przyczyna wprowadzenia zmiany
Poprzednie zachowanie było nieprawidłowe.
Zalecana akcja
Jeśli wyrażenie regularne zawiera ukrytą usterkę, napraw ją. Jeśli wystąpiło obejście tego błędu, możesz usunąć obejście problemu.
Dotyczy interfejsów 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