2010-10-24 23 views
23

tengo unas pocas expresiones regulares:Incluye el "signo menos" en esta expresión regular, ¿cómo?

var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/; 

Se trata de un campo de nombre en una forma de validación.

Necesito que sea posible escribir nombres como este "Anna-nicole" (fíjese en el signo menos). Actualmente, el signo menos causa un error.

Necesito rehacer esta expresión regular para que se pueda incluir un signo menos en el nombre; Preferiblemente debo hacerlo para que el nombre también no pueda comenzar con un signo menos, o terminar con uno. Solo se deben permitir los signos menos entre "palabras o nombres".

¿Alguien sabe cómo hacer esto?

Por cierto, es JavaScript.

+0

Actualmente, permite espacios en ambos extremos. ¿Los quiere también limitados? ¿Y quieres prohibir "Nancy - O'Hara" (con los espacios alrededor de los guiones), y qué pasa con el apóstrofo en el apellido? –

+0

@Jonathan: Sí, me gustaría eso también, ahora que lo mencionas. –

Respuesta

29

Tienes que escapar del signo menos usando la barra invertida.

var alphaExp = /^[a-zA-ZåäöÅÄÖ\s\-]+$/; 

para que dejen de usarlo en el comienzo o el final, intentar algo como esto:

var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s]+$/; 
+0

¿Esto les impedirá usar el signo menos al principio o al final del campo? –

+0

Reemplace el signo "+" con {1} para evitar SOLAMENTE que el primer y el último carácter sean "-" o el primero + con {5} si se permite después de 5 caracteres. http://www.addedbytes.com/cheat-sheets/download/regular-expressions-cheat-sheet-v2.png –

+1

Puede valer la pena señalar que a) el signo menos debe colocarse al principio o al final yb) que escaparse no es necesario en muchas implementaciones de expresiones regulares – redreinard

1
/^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s\]+$/ 

debería hacerlo (la existencia de un caso extremo desagradable de un solo nombre de personaje , que no coincidirá. ¿Se permite o no el nombre de un solo carácter?)

13

En muchos dialectos de expresiones regulares, en una clase de caracteres, un guión/menos debe ser el primero o el último:

/^[-a-zA-ZåäöÅÄÖ\s]+$/ 
/^[a-zA-ZåäöÅÄÖ\s-]+$/ 

Negated clases de personajes:

/^[^-a-zA-ZåäöÅÄÖ\s]+$/ 
/^[^a-zA-ZåäöÅÄÖ\s-]+$/ 

Con corchete cerca también, poner los corchetes en la parte delantera y el guión al final:

/^[]a-zA-ZåäöÅÄÖ\s-]+$/ 

Y si es necesario excluir ambos cierran corchetes y guiones, entonces:

/^[^]a-zA-ZåäöÅÄÖ\s-]+$/ 

Para la pregunta, una interpretación podría ser: desea insistir en los caracteres alfabéticos alrededor de los guiones, y solo quiere permitir espacios al principio y al final, y es posible que desee permitir apóstrofos en los que permita guiones, y desea evitar los consecutivos guiones o apóstrofes.

/^\s*[a-zA-ZåäöÅÄÖ]*([a-zA-ZåäöÅÄÖ]+[-'][a-zA-ZåäöÅÄÖ]+)*\s*$/ 

Advertencia: expresiones regulares probó formalmente con Perl, no JavaScript.

Comienzo de cadena, cero o más espacios; cero o más caracteres alfabéticos; cero o más secuencias de 'uno o más caracteres alfabéticos más guión o apóstrofo y uno o más caracteres alfabéticos', seguidos del final de la cadena. Puede pegar un par de paréntesis adicionales después del primer \s* y antes del segundo \s* para capturar el nombre completo.

Para Anna-nicole, el primer término alfa coincidiría con Ann, y el otro término alfa coincidiría con a-nicole. Para Anonymous, el primer término coincidiría con toda la cadena, el segundo estaría vacío. Para O'Reilly, el primer término estaría vacío y el segundo coincidiría con toda la cadena. Los nombres como "C - d" y "Who''Me" serían rechazados (no se permiten los guiones ni los apóstrofos repetidos). Permitiría Smith-Jones-and-Son como nombre y Smith-And-O'Reilly. No permitirá guiones o apóstrofos iniciales o finales.

Si quisiera permitir el 'primer nombre del apellido', necesitaría dos lotes del 'núcleo' de la expresión regular anterior con \s+ en el medio. Etc.

+0

Gracias Jonathan, pero ¿debo combinar todo esto? Realmente no sé lo que significan todos, solo dime cuál elegir por favor :) –

+1

@Camran: Elige el que necesites, que probablemente sea cualquiera de los dos primeros. Los segundos dos tratan con una clase de carácter negada, donde el primer carácter después de '' [''es''^''. El último es aún más esotérico. Sin embargo, ninguno de ellos se ocupa de los problemas más complejos de garantizar que el guión solo aparezca entre palabras, no asociado a espacios, etc. Estoy medio tentado de eliminar la respuesta, pero la información sobre dónde colocar los guiones en las clases de caracteres en expresiones regulares todavía es útil (espero), a pesar de que no aborda los problemas más grandes (y mucho más) complejos. –

0

Esto puede depender de la implementación. En Javascript, la barra diagonal inversa escapará del signo menos en una clase de caracteres, pero en Oracle, por ejemplo, solo colocar el signo menos primero o el último en la clase de caracteres hará el truco.

+2

¿Le gustaría dar al OP un ejemplo de lo que quiere decir? Tal como al arreglar su código? –

Cuestiones relacionadas