Necesito un RegEx para que coincida con la siguiente condición:

  • 1 o 2 palabras
  • La longitud mínima total es 3
  • La longitud máxima total es 50
  • Aceptar caracteres acentuados
  • Sin números es un plus

Ejemplos de cadenas aceptadas:

  • Karmen Garcia
  • João Pedro
  • Vitor
  • maxiliamum LóPezz
  • Nadál
  • loriPsium PsisVõèrbizbbbbbbbbbb

Ejemplos de cadena no aceptada:

  • Jony Cam Vanis
  • 9lucas P.us-kas1 Li1

Lo que intenté:

  • ^ (?!. *? \ s {2}) [A-Za-z] {3,50} $
  • ^ ([a-zA-Z] [a-zA-Z]) {3,50} $
0
Fábio Silva 13 ene. 2017 a las 17:39

3 respuestas

La mejor respuesta

No pudo etiquetar qué sabor / lenguaje de programación / herramienta regex. Pero aquí hay una forma de hacerlo:

^(?=.{3,50}$)\p{L}*(\s\p{L}*)?$

Utiliza una anticipación positiva para asegurarse de que tenga entre 3 y 50 caracteres. Follwing dice que simplemente busca caracteres de clase de letra unicode, opcionalmente seguidos por un espacio y más letras, es decir, una o dos palabras.

Véalo aquí en regex101.

Editar

OK, entonces para javascript puedes probar

^(?=.{3,50}$)[^\s\d]*(\s[^\s\d]*)?$

Básicamente es lo mismo, solo que en lugar de coincidir con la clase Unicode, coincide con no espacio y dígitos. Eso no es perfecto, pero es una solución simple que funcionará en la mayoría de los casos (latinos).

Vea esto aquí en regex101.

1
SamWhan 13 ene. 2017 a las 15:28

Creo que puedes usar el siguiente. Verifica la longitud mínima pero no la máxima. Puedes asegurarte de otra manera

^([A-Za-z]{3,50}|([A-Za-z]+\s[A-Za-z]+))$
0
Michael Piankov 13 ene. 2017 a las 14:50

Aquí tiene:

(?=^.{3,50}$)(\s*\p{L}+\s*){1,2}

O si no desea ningún espacio en blanco inicial, espacio en blanco final o más de un espacio entre las palabras:

(?=^.{3,50}$)\p{L}+(\s\p{L}+)?

EDITAR:

Como esta otra publicación SO muestra, Javascript tiene un problema con las clases de caracteres Unicode. Entonces, \p{L} no funcionará en Javascript.

¿Qué significa eso para ti? Bueno, esa otra publicación muestra tres soluciones diferentes. La solución adecuada para usted depende de si sabe de antemano exactamente qué caracteres acentuados o caracteres sin palabras (por ejemplo, signos de puntuación) pueden ingresar.

Un posible enfoque es enumerar los caracteres acentuados válidos y luego concatenarlos en la expresión regular:

var validWordCharacters = "[" + "a-z" + "A-Z" + "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ" + "]";

var regex = "(?=^.{3,50}$)" + validWordCharacters + "+(\s" + validWordCharacters + "+)?";

regexCompiled = new RegExp(regex);

Otra solución posible (y más concisa) es usar un rango de puntos de código:

var validWordCharacters = "[" + "a-z" + "A-Z" + "\u00C0-\u024F" + "]";

var regex = "(?=^.{3,50}$)" + validWordCharacters + "+(\s" + validWordCharacters + "+)?";

regexCompiled = new RegExp(regex);
1
Community 23 may. 2017 a las 12:33