Анализ регулярных выражений "^[-\wÀ-ÿ\'\.\-\&\s]+$" - диапазон [x-y] в обратном порядке

Старое приложение веб-формы C# ASP.Net с .Net Framework 4.6.2.

У меня есть валидатор регулярных выражений в пользовательском элементе управления ascx:

<asp:RegularExpressionValidator ID = "REV_RecordId" runat = "server" 
        ControlToValidate = "uxRecordID" 
        ValidationGroup = "TheValidationGroup" 
        Display = "Dynamic" 
        ForeColor = "Red"
        ErrorMessage = "Please enter a valid ID" 
        SetFocusOnError = "True" 
        ValidationExpression = "^[-\wÀ-ÿ\'\.\-\&\s]+$" />

но когда этот элемент управления загружен

UserControl ctrl = (UserControl)LoadControl("path to user control");

Я получаю исключение:

Внутреннее исключение 1:
ArgumentException: синтаксический анализ "^[-\wÀ-ÿ'.-&\s]+$" - диапазон [x-y] в обратном порядке.

но любой валидатор регулярных выражений говорит, что «^[-\wÀ-ÿ'.-&\s]+$» является допустимым, компонент более высокого символа, говорящий «соответствует одному символу в диапазоне между À (индекс 192) и ÿ (индекс 255 ) (с учетом регистра)".

Так почему же здесь не удалось показать еще более странные интерпретации персонажей?

"^[-\wÀ-ÿ\'\.\-\&\s]+$" допустимо, но ошибка вызывает другое регулярное выражение и "^[-\wÀ-ÿ'.-&\s]+$" недействителен. Вы уверены, что ваше регулярное выражение не переопределено. Или вы получаете эту ошибку от другого валидатора?

Onur Gelmez 20.08.2024 17:35

Это похоже на проблему с кодировкой символов. Строки в .NET имеют кодировку UTF16 . Кажется, ваше регулярное выражение предполагает кодовую страницу Windows-1252. В сообщении об ошибке À является результатом того, что (двухбайтовая) кодировка UTF16 À читается так, как если бы это была Windows-1252 (один символ на байт), и аналогично ÿ => ÿ. Без исследования я не могу сказать вам, как исправить это для вашего случая/среды, но это должно дать вам отправную точку.

Neil T 20.08.2024 17:45

существует ли версия À и ÿ в кодировке UTF16?

Robert Achmann 20.08.2024 17:50

Это не тот вопрос, который вам следует задавать. Вам следует задать вопрос: «в какой кодировке я сохранил файл, содержащий мой <asp:RegularExpressionValidator>, и в какой кодировке мне следует его сохранить».

GSerg 20.08.2024 19:20

Спасибо! Другие страницы, которые работают, сохраняются как кодовая страница Unicode (UTF-8 с подписью) 65001. Эта страница, которая не работает, — «Западноевропейская (Windows) — кодовая страница 1252». Пожалуйста, добавьте это как ответ.

Robert Achmann 20.08.2024 21:26

@GSerg Правильная кодировка файла сама по себе решила эту проблему. Спасибо

Robert Achmann 20.08.2024 21:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать другое обозначение символов Юникода:

ValidationExpression = "^[\-\w\u00C0-\u00FF'.&\s]+$"

где À представлено как \u00C0, а ÿ как \u00FF.

Обратите внимание, что ваше исходное регулярное выражение содержит избыточные escape-символы и двойное объявление дефиса (в начале, а затем \-), я сохранил первый, и давайте оставим его экранированным на тот случай, если вы захотите позже использовать регулярное выражение в атрибуте HTML pattern.

Ответ принят как подходящий

существует ли версия À и ÿ в кодировке UTF16?

Это не тот вопрос, который вам следует задавать. Вам следует задаться вопросом: «в какой кодировке я сохранил файл, содержащий мой <asp:RegularExpressionValidator>, и в какой кодировке мне следует его сохранить?»

Ваше регулярное выражение видит выражение, отличное от того, которое вы написали в файле, потому что файл не читается в той же кодировке, в которой вы его сохранили.

Другие вопросы по теме