Udostępnij za pośrednictwem


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 tego błędu może spowodować problemy z kompatybilnością, jeśli twoje wyrażenie regularne zawierało błąd ukryty z powodu tego problemu albo jeżeli zaimplementowałeś obejście dla 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);

Wersja wprowadzona

.NET 7

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Poprzednie zachowanie było nieprawidłowe.

Jeśli wyrażenie regularne zawiera ukrytą usterkę, napraw ją. Jeśli znalazłeś obejście tego błędu, możesz je usunąć.

Interfejsy API, których dotyczy problem