2010-12-22 36 views
8

Estoy intentando crear una expresión regular que solo permita letras mayúsculas o minúsculas, y los caracteres de espacio, '-', ',' '.', '(', Y ')' . Esto es lo que tengo hasta ahora, pero por alguna razón que todavía me deja introducir númerosRegex solo permite letras y algunos caracteres

^[a-zA-Z -,.()]*$ 

cualquier ayuda sería grande! Gracias.

+2

caracteres de escape que son símbolos de expresiones regulares: (.) ​​ –

+1

@ Mathias E: Dentro de un grupo de caracteres, que no tienen que escapar de todas las fichas de expresiones regulares. – unholysampler

+0

¿Esa es realmente la expresión regular que estás usando en realidad? – Gumbo

Respuesta

3

Bueno, hay un problema en que -, se interpreta como un rango, como a-z, permitiendo que todos los caracteres del espacio se coman. Escape y al menos algunos de los errores deberían ser reparados.

^[a-zA-Z \-,.()]*$ 

Estrictamente hablando, probablemente debería también escapar de la .() y, también, ya que estos tienen un significado especial en las expresiones regulares. El motor de expresiones regulares Javascript (donde estaba probando) parece interpretarlos literalmente dentro de un contexto [], de todos modos, pero siempre es mucho mejor ser explícito.

^[a-zA-Z \-,\.\(\)]*$ 

Sin embargo, esto todavía no se debe permitir que 0-9 dígitos, por lo que su código real que se utiliza esta expresión regular, probablemente, tiene un problema, también.

+0

No es necesario escapar '.',' (',') 'dentro de la clase de caracteres. En las clases de caracteres solo ']' y '\' así como '-' y'^'(ambos dependiendo de la posición) tienen un significado especial. – Gumbo

+0

@Gumbo: ahh, todos los motores de expresiones regulares son lo suficientemente inteligentes para eso? Es bueno saber :) – Matchu

+0

Bueno, supongo que sí. – Gumbo

12

- es especial en la clase de caracteres. Se usa para definir un rango como lo ha hecho con a-z.

para que coincida con un literal - que necesita para escapar de ella, ya sea o colocarlo de manera que no va a funcionar como operador de rango:

^[a-zA-Z \-,.()]*$ 
     ^^ escaping \ 

o

^[-a-zA-Z ,.()]*$ 
^placing it at the beginning. 

o

^[a-zA-Z -,.()-]*$ 
      ^placing it at the end. 

y curiosamente

^[a-z-A-Z -,.()]*$ 
    ^placing in the middle of two ranges. 

En el último caso - es colocar entre a-z y A-Z ya que tanto los caracteres que rodean la - (la que queremos tratar literalmente) que es z y A ya están involucrados en rangos, la - se trata literalmente de nuevo .

De todos los métodos mencionados, se recomienda el método de escapar ya que hace que el código sea más fácil de leer y entender. Cualquiera que vea el \ esperaría que se intentara un escape. Colocar el - al principio (final) creará problemas si luego agrega un carácter antes (después) en la clase de caracteres sin escapar del - formando así un rango.

+0

:/Como persona que lee la expresión regular, prefiero que se escape con diferencia. Solo mirando esas otras tres respuestas, es más probable que piense que esto fue un error tipográfico que el uso intencional de un comportamiento oscuro. – Matchu

+0

@Matchu: de acuerdo con usted. He actualizado mi publicación. – codaddict

+0

+1 para una respuesta tan buena y detallada. – suryakiran

2

El  -, en [a-zA-Z -,.()] describe un intervalo de   (0x20) a , (0x2C). Y eso es equivalente a [ !"#$%'()*+,]. Debería escapar del - o colocarlo en otro lugar donde no se interprete como un indicador de rango.

Pero eso no es la causa de este problema ya que las cifras son de 0x30 a 0x39.

0

lo he intentado con javascript y funciona bien. Los otros son correctos, sin embargo. Si está en javascript, compruebe si todo funciona bien o, de lo contrario, la comprobación no se realizará en absoluto.

Cuestiones relacionadas