Я хочу предварительно проверить, выглядит ли введенная строка как Идентификационный номер автомобиля (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 используют разные разновидности регулярных выражений? Это где-то задокументировано?





Не прямой ответ, а просто очевидное замечание:
Если по какой-то причине вычитание класса символов не поддерживается, вы всегда можете использовать в качестве обходного пути:
^[0-9A-HJ-NPR-Z]{17}$
Чтобы задокументировать то, что я поставил в комментариях к этому вопросу:
В статье Практическое руководство. Проверка на соответствие шаблонам для серверных элементов управления ASP.NET. упоминается, что валидатор регулярных выражений на стороне клиента javascript не знает «вычитания класса символов».
Как упоминается в Документация по классу RegularExpressionValidator .Net:
Both server-side and client-side validation are performed unless the browser does not support client-side validation or client-side validation is explicitly disabled (by setting the
EnableClientScriptproperty to false).The regular-expression validation implementation is slightly different on the client than on the server. On the client, JScript regular-expression syntax is used.
On the server,System.Text.RegularExpressions..::.Regexsyntax is used.
JScript regular expression syntax is a subset ofSystem.Text.RegularExpressions..::.Regexsyntax.
It is therefore recommended that JScript regular-expression syntax should be used in order to yield the same results on both the client and the server.
Другая иллюстрация этого побочного эффекта (различные варианты регулярных выражений на стороне сервера и клиента) упоминается в записи блога Проблемы с RegularExpressionValidator.
ИМХО, это не обходной путь, это единственный способ сделать это. Я не знаю, что вообще существует такая вещь, как «вычитание класса персонажа». Или это в каком-то действительно странном аромате регулярных выражений?
Это работает с 2004 года в движке регулярных выражений .Net, но, как указывает msdn.microsoft.com/en-us/library/6xh899wy(VS.85).aspx, валидатор регулярных выражений на стороне клиента javascript не знает «вычитания класса символов» ...
Как упоминалось в msdn.microsoft.com/en-us/library/…, на клиенте используется синтаксис регулярных выражений JScript. На сервере используется синтаксис System.Text.RegularExpressions .. ::. Regex. => Следует использовать синтаксис регулярных выражений JScript.
Другая иллюстрация этого побочного эффекта (различные варианты регулярных выражений между сервером и клиентом) упоминается в weblogs.asp.net/cosgood/archive/2003/05/06/6604.aspx.
RegularExpressionValidator также поддерживает проверку на стороне клиента с использованием JavaScript, где используется механизм JavaScript Regex. Вы видите разницу между реализацией регулярных выражений JavaScript и .NET. Вы можете отключить проверку на стороне клиента и, таким образом, заставить валидатор использовать механизм регулярных выражений .NET за счет дополнительной обратной передачи.
Я просто помещаю ссылки прямо в свой ответ, а не «прячу их» в комментариях.