Javascript: Expresiones Regulares
« Eliminar items del menú contextual de Firefox | Etiquetando los correos no leidos en Gmail »
Las expresiones regulares son una forma de describir cadenas de caracteres que sirven para comparaciones y reemplazos complejos. Por ejemplo si escribimos en la línea de comandos de windows dir *.exe, eso es una expresión regular que define todas las cadenas de caracteres que empiecen con cualquier cosa seguida de .exe, es decir, todos los archivos .exe. La acción de comparar la cadena de texto con el patrón que le hemos dado (la expresión regular) se denomina reconocimiento de patrones (pattern matching).
En Javascript las expresiones regulares se basan en las de Perl, de forma que son muy muy parecidas y se representan por el objeto RegExp (de REGular EXPresion). Para crear una expresión regular podemos usar el constructor del objeto RegExp, pero es mas conveniente utilizar una sintaxis especialmente pensado para ello. Veamos un ejemplo, el mas simple posible.
var patron = /pato/;
Este es el patrón mas sencillo. En una comparación con una cadena devolvería true en el caso de la cadena con la que se compara sea "pato". Todos los patrones se escriben entre barras invertidas, así como las cadenas de texto se escriben entrecomilladas. La otra forma de crear el objeto RegExp es como deciamos utilizando su constructor.
var patron = new RegExp("pato");
Pero en este caso lo que le pasamos al constructor es una cadena, por lo tanto en lugar de usar / lo entrecomillamos. Para complicar un poco mas las cosas supongamos que queremos comprobar si la cadena que nos pasan es pato, pata o pate. Entonces usariamos los corchetes, que indican opción, es decir, al comparar con /[aeo]/ devolvería cierto en caso de que la cadena fuera la letra a, la e o la letra o.
var patron = /pat[aeo]/;
¿Y si quisieramos comprobar si la cadena es pat0, pat1, pat2, …, pat9? En lugar de tener que encerra los 10 dígitos dentro de los corchetes podemos utilizar el guión, que sirve para indicar rangos. Por ejemplo 0-9 serían todos los números de 0 a 9 inclusive.
var patron = /pat[0-9]/;
Si quisieramos por ejemplo que el último caracter fuera o un dígito (0-9) o una letra minúscula (a-z) simplemente se escribirían dentro de los corchetes un criterio detras de otro.
//pat seguido de un número o letra minúscula
var patron = /pat[0-9a-z]/;
//ahora también puede estar seguido de una A mayúscula
var patron2 = /pat[0-9a-zA]/;
¿Y que ocurriría si en lugar de tener solo un número o una letra minúscula quisieramos que pudieran haber varias, pero siempre minúsculas o números? Entonces recurrimos a +, *, ? y {}. + indica que lo que tiene a su izquierda puede estar 1 o mas veces, * indica que puede estar 0 o mas veces (en el caso de + el número o la minúscula tendría que aparecer al menos una vez, con * pat también se aceptaría), ? indica opcionalidad, es decir, lo que tenemos a la izquierda puede o no aparecer (puede aparecer 0 o 1 veces) y por último {} sirve para indicar exactamente el número de veces o que puede aparecer o un rango. Por ejemplo {3} indicaría que tiene que aparecer exactamente 3 veces, {3,8} indicaría que tiene que aparecer de 3 a 8 veces y {3,} tres veces o mas (las que sean). Hay que tener cuidado porque {} exige que se repite lo último, cuando no se esté seguro de lo que va a hacer usamos (). Para ilustrar esto vamos a ver un primer ejemplo real con expresiones regulares:
<script>
var patron = /pat[ao]{2}/;
document.write("patopata".search(patron));
document.write("patoa".search(patron));
patron = /(pat[ao]){2}/;
document.write("patopata".search(patron));
document.write("patoa".search(patron));
</script>
La función search del tipo de objeto de String (asociado a las cadenas de caracteres) comprueba si la cadena representada por el patrón que le pasamos como argumento se encuentra dentro de la cadena sobre la que se llama a search. En el caso de que así sea devuelve la posición (por ejemplo para la cadena pato con el patron /p/ devolvería 0, 1 si el patrón es a, 2 si es t,…) y -1 si no se encuentra. Otra función útil que merece la pena comentar es cadena.replace(patron, sustituto), que sustituye en la cadena sobre la que se llamó las ocurrencias del patrón por la cadena especificada
Si ejecutamos el programa anterior la salida por pantalla será -100-1, es decir, la primera y última llamada a search devuelven no encontrado y la segunda y las otras dos encuentran la cadena en la posición 0. Si nos fijamos vemos que esto es obvio. El patrón que definimos primero, /pat[ao]{2}/ incluye las cadenas "pataa", "patao", "patoo" y "patoa", ya que lo que indica {2} que debe repetirse dos veces es [ao], no pat[ao]. Sin embargo cuando redefinimos el valor del patron utilizamos los paréntesis de forma que {2} se aplique sobre pat[ao].
Otro elemento interesante en las expresiones regulares es la especificación de las posiciones en que se tiene que encontrar la cadena, esa es la utilidad de ^ y $, que indican que el elemento sobre el que actúa debe ir al principio de la cadena o al final de esta.
//buscamos "oo" y que se encuentre al principio de la cadena en la que esté
var patron = /^aa/;
//buscamos uu al final de la cadena
patron = /uu$/;
Otros elementos a tener en cuenta son:
- \d un dígito. Equivale a [0-9]
- \D cualquier caracter que no sea un dígito.
- \w Cualquier caracter alfanumérico. Equivalente a [a-zA-Z0-9_].
- \W cualquier caracter no alfanumérico
- \s espacio
- \t tabulador
Inicio
Archivos
Suscribirse
Acerca de
Contacto
Traducciones
Wiki
Entrada aleatoria
basico pero muy bien explicado, FELICIDADES!!!
Hola, podrías decirme que significa esta expresión regular?
/\W/i
Tengo duda con la "i" del final.
De antemano muchas gracias.
La "i" es para que no distinga entre mayúsculas y minúsculas.
Vaya hace mucho que buscaba la explicación de eso…..No lo entendía.
Gracias…. I LOVE U
Alguien me podría decir porqué sólo me funciona una de las dos y no las dos juntas.
formato = sel.text;
formato = formato.replace(/\[b-p\]/,"[--p]");
formato = formato.replace(/\[\/("b-p")\]/,"[/--p]");
var intro = /[0-9]{1,3}-{1}[0-9]/;
¿esta expresion equivale a esto ?
1 - 1111
11 - 11111111
111 - 11111111
Gracias.
Hola, he estado mirando una exprecion para validar mail, pero no he encontrado una que funcione bien y si funciona no la entiendo, me pordian ayudar a entender esta: ^(.+\@.+\..+)$
Gracias
como puedo buscar esta subcadena:
(*)
o acunque sea solo el asterisco…
Aquí hay una expresión regular para email más entendible.
[_a-z0-9-]+(.[_a-z0-9-]+)*@([0-9a-z](-?[0-9a-z])*.)+[a-z]{2}([zmuvtg]|fo|me)?
¿No sale entera? Ahí va de nuevo.
[_a-z0-9-]+(.[_a-z0-9-]+)*@([0-9a-z](-?[0-9a-z])*.)+[a-z]{2}([zmuvtg]|fo|me)?
No. No sale entera. Ahí la juntan.
[_a-z0-9-]+(.[_a-z0-9-]+)*@
([0-9a-z](-?[0-9a-z])*.)+
[a-z]{2}([zmuvtg]|fo|me)?
No se porque no valida la longitud máxima en esta expresion : /\d{2,4}/ esto deberia validar cadenas de numeros entre 2 y 4 digitos pero el 12345 lo da como bueno.
Necesito un patron que controle todos los enteros y ademas del tabulador , gracias
Esta es una respuesta para Luis Fernando sobre la siguiente expresion regular "^(.+\@.+\..+)$", en primer lugar debemos indicar que los caracteres "^" y "$" indican el inicio y fin del patrón, luego tenemos el "." que es el metacaracter (caracter para referirnos a otros caracteres) que sirve para identificar cualquier caracter seguido de "+" que sirve para indicar que se repite 1 o más veces, luego tenemos "\@" con lo que estamos indicando que el "@" debe estar, luego tenemos "\." con lo que se indica que el "." debe estar y por último tenemos nuevamente el ".+" que como comenté significa cualquier caracter 1 o más veces.
De igual manera esa expresión tiene un error y es que por ejemplo permite cosas como esta:
micorreo@@correo.com
Hola necesito hacer una expresion regular que valide que solo sea texto y no permita caracteres especiales, no he podido hacerla.
PD:y he probado alguno ejemplos y alguno no me funcionan y otros si, esto de que depende?????
Por favor ayudenme…..
necesito un patron que controle el nombre espacio apellido espacio apellido
Liosdany: Solo valida texto,,,cadenas
—————
var ExpReg_cad=/^[aA-zZ]*$/;
if (ExpReg_cad.test(campo.value)==false && campo.value.length>0 ){
alert(messageError('Sólo puede ingresar letras'));
campo.value="";
return false;
}
—————————--
valida texto, numero y espacios
var ExpReg_aln= /^[\s-\w]*$/;
if (ExpReg_aln.test(campo.value)==false && campo.value.length>0 ){
alert(messageError('Sólo puede ingresar letras, numeros y espacios'));
campo.value="";
return false;
}
[...] Ayuda con validacion de datos Las validaciones las tendrias que hacer con expresiones regulares. [...]
Alguien sabe como hacer que solo escriban texto o numero, pero en asp .net utilizando un textbox?
Gracias
Luis Fernando prueba con este patron para email:
Ej:
var patronEmail=/(^[0-9a-zA-Z]+(?:[._][0-9a-zA-Z]+)*)@([0-9a-zA-Z]+(?:[._-][0-9a-zA-Z]+)*\.[0-9a-zA-Z]{2,3})$/;
if (!patronEmail.test(email a validar))
alert("Email incorrecto");
Como se puede hacer un patron que verifique un Rut(Chileno). Sin tomar en cuenta la validacion matematica.
Los rut tienen la siguien forma:
XY.YYY.YYY-Z
La X es Opcional [0-9].
Las Y son necesarias [0-9].
La Z es necesaria [1-9k].(la k puede ser mayuscula o minuscula.
se me ocurrio algo como:
/^([0-9]{1,2}(\.|")[0-9]{3}(\.|")[0-9]{3}(-|)[1-9|k|K]/$
pero no resulta xD
la verdad es que lo hice con lo que he entendido en foros y cosas por el estilo
Hola necesito saber que como validar dos numeros 49 y 28 ya valido para uno solo en esta expresion regular
[RegexValidator(@"^49(\d{5}?)", Ruleset = "STCCRules",
MessageTemplateResourceName = "ErrorLenWar",
MessageTemplateResourceType = typeof(ErrorMessages))]
cualquier ayuda se los agrecere mucho.
saludos
Aca hay una validacion de mail que me funciono, este es el patron ("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");
¿como puede obtener solo unos digitos de una cadena de digitos? Por ejemplo la cadena es 12345667 y quiero obtener 3456
Esta pagina esta muy interesante, y el contenido me parece excelente, creo que me sera de mucha utilidad en el futuro proximo..
Hola,
A ver si alguien me puede ayudar. Necesito una expresión regular para validar un combo (lista desplegable). Por defecto la lista sale con el valor "--selecciona opción--". Y necesito comprobar mediante una expresión regular cuando el usuario ha seleccionado una opción del combo QUE NO SEA la inicial de "--selecciona opción--". Es decir, necesitaría una expresión que me dijera… true si la cadena/valor seleccionado no contiene el guión (-), por ejemplo.
¿A alguien se le ocurre alguna solución?
¡Gracias!