Tengo esta expresión regular:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/;
Esto es para un campo de nombre en una validación de formulario.
Necesito que sea posible escribir nombres como este “Anna-nicole” (tenga en cuenta el guión). Actualmente el guión causa error.
Necesito rehacer esta expresión regular para que se pueda incluir un guión en el nombre; preferiblemente debería hacerlo para que el nombre también no poder comenzar con un guión o terminar con uno. Solo se deben permitir guiones entre “palabras o nombres”.
¿Alguien sabe cómo hacer esto?
Por cierto, es JavaScript.
emilio h
Tienes que escapar del signo menos usando una barra invertida.
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s\-]+$/;
Para evitar que lo usen al principio o al final, intente algo como esto:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s]+$/;
-
¿Esto evitará que usen el signo menos al principio o al final del campo?
– usuario188962
24/10/2010 a las 18:55
-
Reemplace el signo “+” con {1} para evitar que SOLO el primer y el último carácter sean “-” o el primer + con {5} si se debe permitir después de 5 caracteres. addedbytes.com/cheat-sheets/download/…
– Martín Clemens Bloch
1 de julio de 2013 a las 11:47
-
Puede valer la pena señalar que a) el signo menos debe colocarse al principio o al final y b) que no es necesario escapar en muchas implementaciones de expresiones regulares
– Red Reinard
28/10/2014 a las 17:48
-
¿Hay alguna manera de escapar de todos ellos a la vez, para mejorar la legibilidad?
– Oker
23 de agosto de 2019 a las 7:00
jonathan leffler
En muchos dialectos de expresiones regulares, en una clase de caracteres, un guión simple/menos debe ser el primero o el último:
/^[-a-zA-ZåäöÅÄÖ\s]+$/
/^[a-zA-ZåäöÅÄÖ\s-]+$/
Clases de caracteres negados:
/^[^-a-zA-ZåäöÅÄÖ\s]+$/
/^[^a-zA-ZåäöÅÄÖ\s-]+$/
También con corchetes cerrados, coloque el corchete al frente y el guión al final:
/^[]a-zA-ZåäöÅÄÖ\s-]+$/
Y si necesita excluir tanto los corchetes como los 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 desea permitir espacios al principio y al final, y es posible que desee permitir apóstrofes donde permite guiones, y desea evitar guiones consecutivos o apóstrofes.
/^\s*[a-zA-ZåäöÅÄÖ]*([a-zA-ZåäöÅÄÖ]+[-'][a-zA-ZåäöÅÄÖ]+)*\s*$/
Advertencia: expresiones regulares probadas formalmente con Perl, no con 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 un guión o apóstrofe y uno o más caracteres alfabéticos’, seguidos del final de la cadena. Podría colocar un par de paréntesis extra después del primero \s*
y antes del segundo \s*
para capturar el nombre completo.
Para Anna-nicole
el primer término alfa coincidiría Ann
y el otro término alfa coincidiría 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. Nombres como “C–d” y “Who’Me” serían rechazados (no se permiten guiones ni apóstrofes repetidos). permitiría Smith-Jones-and-Son
como nombre y Smith-And-O'Reilly
. No permitirá guiones o apóstrofes iniciales o finales.
Si quisiera permitir ‘nombre apellido’, necesitaría dos lotes del ‘núcleo’ de la expresión regular anterior con \s+
entre. Etc.
-
Gracias Jonathan, pero ¿debería combinar todo esto? Realmente no sé lo que significan todos, solo dime cuál elegir por favor 🙂
– usuario188962
24 de octubre de 2010 a las 19:06
-
@Camran: elija el que necesita, que probablemente sea uno de los dos primeros. Los dos segundos tratan con una clase de carácter negada, donde el primer carácter después de ‘
[
‘ is ‘^
‘. The last is even more esoteric. However, they don’t any of them deal with the more complex issues of ensuring that dash only appears between words, not associated with spaces, etc. I’m half-tempted to delete the answer – but the information about where to place dashes in character classes in regular expressions is still useful (I hope), even though it doesn’t address the bigger (and much more) complex issues.– Jonathan LefflerOct 24, 2010 at 19:32
/^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s\]+$/
debería hacerlo (hay un caso extremo desagradable de un nombre de un solo personaje, que esto no coincidirá. ¿Se permite un nombre de un solo personaje o no?)
Moldeo Helge
Esto puede depender de la implementación.
En JavaScript, la barra invertida escapará del signo menos en una clase de caracteres, pero, por ejemplo, en Oracle, solo poner el signo menos primero o último en la clase de caracteres hará el truco.
Actualmente permite espacios en ambos extremos, ¿también quiere que estén limitados? Y tú quieres proscribir’
Nancy - O'Hara
‘ (con los espacios alrededor de los guiones), y ¿qué pasa con el apóstrofe en el apellido?–Jonathan Leffler
24/10/2010 a las 19:00
@Jonathan: Sí, también me gustaría eso, ahora que lo mencionas.
– usuario188962
24 de octubre de 2010 a las 19:04