RegularExpressionValidator использует другой вкус, чем Regex? - PullRequest
5 голосов
/ 04 декабря 2008

Я хочу сделать предварительную проверку, если введенная строка выглядит как Идентификационный номер транспортного средства (VIN) . Я знаю, что он состоит из 17 букв и цифр, но буквы I, O и Q не допускаются внутри VIN, поэтому я использую это регулярное выражение:

^[0-9A-Z-[IOQ]]{17}$ 

Теперь, если я проверяю строку типа 1G1FP22PXS2100001 с RegularExpressionValidator, она завершается ошибкой, но CustomValidator с этим обработчиком события OnServerValidate

Regex r = new Regex("^[0-9A-Z-[IOQ]]{17}$");
args.IsValid = r.IsMatch(TextBox1.Text);

работает хорошо.

Эксперименты показывают, что RegularExpressionValidator не поддерживает Вычитание класса символов , но класс Regex делает.

Теперь мне интересно, почему эти два .NET-класса используют разные типы регулярных выражений? Это где-то задокументировано?

Ответы [ 2 ]

8 голосов
/ 04 декабря 2008

Не прямой ответ, а просто очевидное замечание:

Если по какой-либо причине вычитание класса символов не поддерживается, вы всегда можете использовать в качестве обходного пути:

^[0-9A-HJ-NPR-Z]{17}$

Чтобы задокументировать то, что я положил в комментарии к этому вопросу:

В статье Как выполнить проверку шаблонов для серверных элементов управления ASP.NET упоминается, что валидатор регулярных выражений на стороне клиента javascript не знает «вычитание класса символов»

Как упомянуто в RegularExpressionValidator Class. Net документация :

Проверка на стороне сервера и на стороне клиента выполняется, если только браузер не поддерживает проверку на стороне клиента или проверка на стороне клиента явно отключена (установив для свойства EnableClientScript значение false).

Реализация проверки правильности регулярного выражения немного отличается на клиенте, чем на сервере. На клиенте используется синтаксис регулярных выражений JScript.
На сервере используется синтаксис System.Text.RegularExpressions..::.Regex.
Синтаксис регулярного выражения JScript является подмножеством System.Text.RegularExpressions..::.Regex синтаксиса .
Поэтому рекомендуется использовать синтаксис регулярных выражений JScript , чтобы получить одинаковые результаты как на клиенте, так и на сервере.

Другая иллюстрация этого побочного эффекта (различные разновидности регулярных выражений на стороне сервера и клиента) упоминается в RegularExpressionValidator, горе запись в блоге.

5 голосов
/ 04 декабря 2008

RegularExpressionValidator также поддерживает проверку на стороне клиента с использованием JavaScript, где используется механизм JavaScript Regex. Разница, которую вы видите, - это разница между реализацией регулярных выражений JavaScript и .NET. Вы можете отключить проверку на стороне клиента и, таким образом, заставить средство проверки использовать механизм регулярных выражений .NET по цене дополнительного постбека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...