Ver Mensaje Individual
  #2 (permalink)  
Antiguo 11/09/2011, 08:09
Avatar de Raziel_Ravenheart
Raziel_Ravenheart
 
Fecha de Ingreso: agosto-2011
Ubicación: Ibagué, Tolima
Mensajes: 192
Antigüedad: 12 años, 8 meses
Puntos: 37
Respuesta: Comprobar textbox con expresiones regulares

Revisemos rápidamente la lógica

Primero la expresión regular:
tienes esto
/[A-Za-z]/.test(nombre)
lo cual va a devolver true si el nombre contiene solo letras, siempre, cuando le antepones el signo !, le estas solicitando al interprete que no deje ejecutar las instrucciones del if, a menos que el valor se falso

escribir
!/[A-Za-z]/.test(nombre)

es lo mismo que escribir

/[A-Za-z]/.test(nombre) == false

lo cual nunca va a suceder si escribes solo letras, por que siempre que se escriban solo letras, va a ser true el valor devuelto, por eso cuando ingresas números, va a retornar false, por que no se cumple la expresión y por lo tanto tu condición va a ser verdadera y va a permitir la ejecución del código. Es decir para que se evalue verdadero el valor retornado por la función test, quítale el signo de admiración.

Ahora diices que el nombre tenga una longitud mayor a 5 letras. Con:

nombre.length < 5

se evalua true cuando el nombre tiene menos de 5 letras, por lo tanto permite la ejecución del if, es decir, cuando el nombre tiene entre 0 y 4 letras, el código se va a ejecutar. Necesitas usar esto, de la siguiente manera

nombre.length > 5; que se lee, cuando la longitud de nombre sea mayor que 5, acuerdate bien de estos detalles de matemáticas para que puedas armar bien tus expresiones booleanas.

Ahora y por ultimo, dices que ambas se tienen que cumplir, es decir, el nombre solo debe contener letras y su longitud ser mayor a 5 caracteres, entonces para eso tienes que utilizar el otro operador lógico es decir:

if (/[A-Za-z]/.test(nombre) && nombre.length > 5) {
//código a ejecutarse
}

Acuerdate muy bien de las tablas de verdad, dicen que, cuando se utiliza el operador logico OR (||), si una de las dos expresiones evalua verdadero, toda la expresión será verdadera. En cambio tu necesitas que se cumplan las dos, por eso debes unirlas con el otro operador, el AND (&&), ya que si alguna de las dos no se cumple, entonces no se ejecutan las instrucciones dentro del if.

Te recomiendo que repases conceptos de lógica y algo de matemática, por que no eres el único al que le pasa, muchas personas tienen este lio, y se dejan traumatizar, sin saber que pueden hacer pruebas, como esta, que espero la hagas algún día, por ejemmplo, con los valores ya cargados en las variables, has esto:

alert(nombre.length > 5 );
alert(/[A-Za-z]/.test(nombre) );
alert( /[A-Za-z]/.test(nombre) && nombre.length > 5 );

Y probando con distintas variaciones, como por ejemplo la que tenías
alert(! /[A-Za-z]/.test(nombre) || nombre.length < 5 );

ultima recomendación, utiliza en lo posible expresiones regulares dentro de variables, para que no te confundas, es decir, puedes hacer algo como

var exp = /[A-Za-z]/g
exp.test(nombre)

de este modo podrás modificar la expresión regular o reutilizarla, sin complicarte la vida, ya que es muy seguro que más adelante tengas que utilizar una o varias y estarlas cambiando cuando se compilan o prueban, puede ser muy cansado.

no es un método óptimo de depuración, pero al menos te ayudara a salir del paso, y entender cuando una expresión evalua el valor que necesitas, y comprender que retornan las funciones y por que.

Ok, exitos