Tengo esta expresión regular ^[A-ZÆØÅa-zæøå\ \-]{2,50}$ para validar nombres. ¿Cómo puedo hacer que permita solo un "-". Quiero que acepte nombres como este:
Janet Smith-Johnson Mary-Ann Johnson Sara Mary John-Smith Sara Johnson Sara Mary Johnson Pero no puede permitir nombres que comiencen con - y terminen con - . Me gusta:
-Janet Mary Mary-Puede hacer coincidir su clase de personaje sin espacios, luego, opcionalmente, repetir un espacio y nuevamente usar la clase de personaje sin espacios.
Luego, opcionalmente, haga coincidir - y el mismo mecanismo nuevamente.
^(?=.{2,50}$)[A-ZÆØÅa-zæøå]+(?: [A-ZÆØÅa-zæøå]+)*(?:-[A-ZÆØÅa-zæøå]+(?: [A-ZÆØÅa-zæøå]+)*)?$El patrón en partes coincide con:
^ Comienzo de cadena(?=.{2,50}$) Afirmar 2 - 50 caracteres[A-ZÆØÅa-zæøå]+ Coincide con lo que aparece en la clase de caracteres sin espacios(?: [A-ZÆØÅa-zæøå]+)* Opcionalmente repetir la clase de carácter precedida por un espacio(?: Grupo de no captura para emparejar como un todo-[A-ZÆØÅa-zæøå]+ Coincide con lo que aparece en la clase de caracteres sin espacios(?: [A-ZÆØÅa-zæøå]+)* Opcionalmente repetir la clase de carácter precedida por un espacio)? Cierre el grupo de no captura y hágalo opcional$ Fin de la cadenaPuedes usar
^(?=.{2,50}$)(?!(?:.*-){2})[A-ZÆØÅa-zæøå]+(?:[- ][A-ZÆØÅa-zæøå]+)*$Vea la demostración de expresiones regulares .
Si está utilizando la expresión regular en C# o con el indicador u en JavaScript compatible con el estándar ECMAScript 2018+, también puede hacer coincidir cualquier letra Unicode con \p{L} :
^(?=.{2,50}$)(?!(?:.*-){2})\p{L}+(?:[- ]\p{L}+)*$Detalles :
^ - comienzo de la cadena(?=.{2,50}$) - de dos a cincuenta caracteres en la cadena permitida(?!(?:.*-){2}) (o (?!(?:[^-]*-){2}) en el código real es más eficiente) - no se permiten dos guiones[A-ZÆØÅa-zæøå]+ - una o más letras del conjunto ( \p{L} coincide con cualquier letra Unicode)(?:[- ][A-ZÆØÅa-zæøå]+)* - cero o más secuencias de espacio o - y luego una o más letras$ - final de la cadena.