2008-12-04 9 views
5

Quiero hacer una verificación preliminar si la cadena ingresada se ve como Vehicle Identification Number (VIN). Sé lo que se compone de 17 letras y dígitos, pero las letras I, O y Q no están permitidos dentro de VIN, así que utilizo esta expresión regular:¿RegularExpressionValidator utiliza otro sabor que Regex?

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

Ahora bien, si puedo comprobar una cadena como 1G1FP22PXS2100001 con RegularExpressionValidator falla , pero CustomValidator con este controlador de eventos OnServerValidate

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

funciona bien.

Los experimentos muestran que RegularExpressionValidator no admite Character Class Subtraction, pero la clase Regex sí.

Ahora me interesa ¿por qué estas dos clases de .NET utilizan diferentes sabores de expresiones regulares? ¿Está documentado algo?

+0

Acabo de poner los enlaces directamente en mi respuesta en lugar de "ocultarlos" en los comentarios. – VonC

Respuesta

5

RegularExpressionValidator también admite la validación del lado del cliente mediante JavaScript, donde se utiliza el motor JavaScript Regex. La diferencia que ves es la diferencia entre el JavaScript y la implementación de expresiones regulares de .NET. Puede desactivar la validación del lado del cliente y, por lo tanto, forzar al validador a utilizar el motor de expresiones regulares .NET, al precio de la devolución posterior.

7

No es una respuesta directa, pero sólo una observación obvia:

Si por no se admite alguna razón la resta clase de caracteres, siempre se puede utilizar como una solución:

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

para documentar lo Puse en los comentarios de esta pregunta:

El artículo How to: Validate Against Patterns for ASP.NET Server Controls, hace mención th en el lado del cliente javascript validador de expresiones regulares no sabe "sustracción clase de caracteres"

Como lo mencionan en RegularExpressionValidator Class .Net documentation:

Tanto del lado del servidor y la validación del lado del cliente se llevan a cabo a menos que el navegador no soporta la validación del lado del cliente o la validación del lado del cliente está explícitamente deshabilitada (estableciendo la propiedad EnableClientScript en falso).

La implementación de validación de expresiones regulares es ligeramente diferente en el cliente que en el servidor. En el cliente, se utiliza la sintaxis de expresiones regulares de JScript.
En el servidor, se utiliza la sintaxis System.Text.RegularExpressions..::.Regex.
La sintaxis de expresiones regulares de JScript es un subconjunto de la sintaxis System.Text.RegularExpressions..::.Regex.
Por lo tanto, se recomienda que se use la sintaxis de expresiones regulares de JScript para obtener los mismos resultados tanto en el cliente como en el servidor.

Otro ejemplo de ese efecto secundario (diferentes sabores de expresiones regulares entre servidor y cliente lados) se ve mencionado en RegularExpressionValidator woes entrada de blog.

+0

En mi humilde opinión, esa no es la solución, esa es la única manera de hacerlo. No estoy enterado de que algo como la "sustracción de clases de caracteres" exista. ¿O tiene un sabor regex realmente extraño? – Tomalak

+0

Lo hace, desde 2004, en .Net Regex Engine, pero como se señala en http://msdn.microsoft.com/en-us/library/6xh899wy(VS.85).aspx, el validador de expresiones regulares javascript del lado del cliente no sabe "sustracción de clases de caracteres" ... – VonC

+0

Como se menciona en http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.regularexpressionvalidator.aspx, en el cliente, JScript regular- la sintaxis de expresión se usa. En el servidor, se utiliza la sintaxis de System.Text.RegularExpressions .. ::. Regex. => Se debe usar la sintaxis de expresiones regulares de JScript. – VonC

Cuestiones relacionadas