2011-03-08 27 views
5

que tiene una expresión regular:de colon dentro de una expresión regular para Javascript

/^([a-zA-Z0-9_ -.''""]+)$/ 

Funciona perfectamente bien permitiendo alfabetos, números y algunos caracteres especiales como -, ., ' y ".

No, quiero que también permita dos puntos (:). Probé la siguiente expresión regular pero falla, comienza a permitir muchos otros caracteres especiales.

/^([a-zA-Z0-9_ :-.''""]+)$/ 

¿Alguna idea de por qué?

Respuesta

8

- tiene un significado especial en las clases de caracteres, al igual que en a-z. Prueba esto:

/^([a-zA-Z0-9_ :\-.'"]+)$/ 

-. (espacio para poner los puntos) permite que unos pocos caracteres adicionales, como #, $ y más. Si eso fue intencional, probar:

/^([a-zA-Z0-9_ -.'":]+)$/ 

Además, sabe que no tiene que incluir cualquier carácter más de una vez, eso es bastante inútil. ' y " aparecieron dos veces cada uno, se pueden eliminar de forma segura.

Por cierto, cantar dos puntos aparece después de el punto en el character table, que la expresión regular no es válida. No debería permitir caracteres adicionales, se supone que debes obtener un error. En Firefox, obtienes: invalid range in character class.

+0

Una alternativa más legible podría ser mover el '-' al principio o al final de la clase de caracteres (lo que también hace que pierda su significado especial). –

+0

@cebewee - bueno, eso depende. Me gusta escapar de todos modos, para asegurarme de que su significado sea claro y para evitar errores. Otro desarrollador puede cambiar '[a-z _-]' a '[a-z_- ~]', y entonces tenemos un problema. – Kobi

+0

+1, escaparse es siempre más seguro. – codaddict

1

Probablemente la expresión sea incorrecta para empezar. Tiene /^([a-zA-Z0-9_ -.''""]+)$/ donde probablemente se refiera a /^([a-zA-Z0-9_ \-.''""]+)$/ (observe la barra invertida delante del guión). El - dentro de [] indica un rango, por lo que -. (punto del tablero del espacio) significa "de un espacio a un punto" y si pone los dos puntos allí, simplemente cambia ese rango.

por lo que añadir los dos puntos y escapar del guión (y la eliminación de la redundancia ' y " cerca del final), es probable que quieren: /^([a-zA-Z0-9_ \-.'":]+)$/

+0

Gracias.Tienes razón. – Rajesh

5

que puede utilizar:

/^([a-zA-Z0-9_ :.'"-]+)$/ 

He movido - hasta el final de la clase de caracteres para que se trate literalmente y no como operador de rango. El mismo problema existe en su expresión regular original, donde - se trata como operador de rango.

También he dejado redundantes ' y " de la clase de caracteres.

+0

Gracias. Incluso esto funciona :) – Rajesh

Cuestiones relacionadas