Una expresión regular define
un patrón de búsqueda para cadenas de caracteres.
La podemos utilizar
para comprobar si una cadena contiene o coincide con el patrón. El contenido de
la cadena de caracteres puede coincidir con el patrón 0, 1 o más veces.
Algunos ejemplos de
uso de expresiones regulares pueden ser:
-
para
comprobar que la fecha leída cumple el patrón dd/mm/aaaa
-
para
comprobar que un NIF está formado por 8 cifras, un guión y una letra
-
para
comprobar que una dirección de correo electrónico es una dirección válida.
-
para
comprobar que una contraseña cumple unas determinadas condiciones.
-
Para
comprobar que una URL es válida.
-
Para
comprobar cuántas veces se repite dentro de la cadena una secuencia de
caracteres determinada.
-
Etc.
Etc.
El patrón se busca en el String de izquierda a derecha. Cuando se
determina que un carácter cumple con el patrón este carácter ya no vuelve a
intervenir en la comprobación.
Ejemplo:
La expresión regular "010" la
encontraremos dentro del String "010101010" solo dos veces: "010101010"
Símbolos comunes en expresiones regulares
Descripción
|
|
. |
Un
punto indica cualquier carácter
|
^expresión |
El
símbolo ^ indica el principio del String. En este caso el String debe
contener la expresión al principio.
|
expresión$ |
El símbolo $ indica el final del String. En este caso el
String debe contener la expresión al final.
|
[abc] |
Los corchetes representan una definición de conjunto.
En este ejemplo el
String debe contener las letras a ó b ó c.
|
[abc][12] |
El String
debe contener las letras a ó b ó c seguidas de 1 ó 2
|
[^abc] |
El
símbolo ^ dentro de los corchetes indica negación. En este caso el String
debe contener cualquier carácter excepto a ó b ó c.
|
[a-z1-9] |
Rango. Indica las letras minúsculas
desde la a hasta la z (ambas incluidas) y los dígitos desde el 1 hasta el 9 (ambos
incluidos)
|
A|B |
El carácter
| es un OR. A ó B
|
AB
|
Concatenación.
A seguida de B
|
Meta caracteres
Expresión
|
Descripción
|
\d |
Dígito. Equivale a [0-9]
|
\D |
No dígito. Equivale a [^0-9]
|
\s |
Espacio
en blanco. Equivale a [ \t\n\x0b\r\f]
|
\S |
No
espacio en blanco. Equivale a [^\s]
|
\w |
Una
letra mayúscula o minúscula, un dígito o el carácter _
Equivale
a [a-zA-Z0-9_]
|
\W |
Equivale a [^\w]
|
\b |
Límite de una palabra.
|
En Java debemos usar
una doble barra invertida \\
Por ejemplo para
utilizar \w tendremos que escribir \\w.
Si queremos indicar que la barra invertida en un carácter de la expresión
regular tendremos que escribir \\\\.
Cuantificadores
Expresión
|
Descripción
|
{X} |
Indica
que lo que va justo antes de las llaves se repite X veces
|
{X,Y} |
Indica que lo que va justo antes de las llaves se repite
mínimo X veces y máximo Y veces. También podemos poner {X,} indicando que se
repite un mínimo de X veces sin límite máximo.
|
* |
Indica
0 ó más veces. Equivale a {0,}
|
+ |
Indica
1 ó más veces. Equivale a {1,}
|
? |
Indica
0 ó 1 veces. Equivale a {0,1}
|
Para usar expresiones
regulares en Java se usa el package java.util.regex
Contiene las clases Pattern y Matcher
y la excepción PatternSyntaxException.
Clase Pattern: Un objeto de esta clase representa la
expresión regular. Contiene el método compile(String regex) que recibe como parámetro la expresión regular y devuelve un
objeto de la clase Pattern.
La clase Matcher: Esta clase compara el String y la
expresión regular. Contienen el método matches(CharSequence input) que recibe como parámetro el String a
validar y devuelve true si coincide con el patrón. El método find() indica si el String contienen el patrón.
Ejemplos de Expresiones
Regulares en Java:
1. Comprobar si el String
cadena contiene exactamente el patrón
(matches) “abc”
Pattern pat = Pattern.compile("abc");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("SI");
} else {
System.out.println("NO");
}
2. Comprobar si el String
cadena contiene “abc”
Pattern pat = Pattern.compile(".*abc.*");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("SI");
} else {
System.out.println("NO");
}
También
lo podemos escribir usando el método find:
Pattern pat = Pattern.compile("abc");
Matcher mat = pat.matcher(cadena);
if (mat.find()) {
System.out.println("Válido");
} else {
System.out.println("No Válido");
}
3. Comprobar si el String
cadena empieza por “abc”
Pattern pat = Pattern.compile("^abc.*");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("Válido");
} else {
System.out.println("No Válido");
}
4. Comprobar
si el String cadena empieza por “abc”
ó “Abc”
Pattern pat = Pattern.compile("^[aA]bc.*");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("SI");
} else {
System.out.println("NO");
}
5. Comprobar
si el String cadena está formado por un
mínimo de 5 letras mayúsculas o minúsculas y un máximo de 10.
Pattern pat = Pattern.compile("[a-zA-Z]{5,10}");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("SI");
} else {
System.out.println("NO");
}
6. Comprobar
si el String cadena no empieza por un
dígito
Pattern pat = Pattern.compile("^[^\\d].*");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("SI");
} else {
System.out.println("NO");
}
7. Comprobar
si el String cadena no acaba con un
dígito
Pattern pat = Pattern.compile(".*[^\\d]$");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("SI");
} else {
System.out.println("NO");
}
8. Comprobar
si el String cadena solo contienen
los caracteres a ó b
Pattern pat = Pattern.compile("(a|b)+");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("SI");
} else {
System.out.println("NO");
}
9. Comprobar
si el String cadena contiene un 1 y
ese 1 no está seguido por un 2
Pattern pat = Pattern.compile(".*1(?!2).*");
Matcher mat = pat.matcher(cadena);
if (mat.matches()) {
System.out.println("SI");
} else {
System.out.println("NO");
}
Ejemplo:
expresión regular para comprobar si un email es válido
package ejemplo1;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Ejemplo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String email;
System.out.print("Introduce email: ");
email = sc.nextLine();
Pattern pat = Pattern.compile("^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");
Matcher mat = pat.matcher(email);
if(mat.find()){
System.out.println("Correo Válido");
}else{
System.out.println("Correo No Válido");
}
}
}
Hemos usado la siguiente expresión
regular para comprobar si un email es válido:
"^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"
La explicación de cada parte de la
expresión regular es la siguiente:
[\\w-]+
|
Inicio
del email
El
signo + indica que debe aparecer uno o más de los caracteres entre corchetes:
\\w
indica caracteres de la A a la Z tanto mayúsculas como minúsculas, dígitos
del 0 al 9 y el carácter _
Carácter
–
En lugar de usar \\w podemos escribir el rango de
caracteres con lo que esta expresión quedaría así:
[A-Za-z0-9-_]+
|
(\\.[\\w-]+)*
|
A continuación:
El *
indica que este grupo puede aparecer cero o más veces. El email puede
contener de forma opcional un punto
seguido de uno o más de los caracteres entre corchetes.
|
@
|
A continuación debe contener
el carácter @
|
[A-Za-z0-9]+
|
Después de la @ el email debe
contener uno o más de los caracteres que aparecen entre los corchetes
|
(\\.[A-Za-z0-9]+)*
|
Seguido (opcional, 0 ó más
veces) de un punto y 1 ó más de los caracteres entre corchetes
|
(\\.[A-Za-z]{2,})
|
Seguido de un punto y al menos
2 de los caracteres que aparecen entre corchetes (final del email)
|
Usar
expresiones regulares con la clase String. Métodos matches y splits.
String.matches(regex)
Podemos comprobar si
una cadena de caracteres cumple con un patrón usando el método matches de la
clase String. Este método recibe como parámetro la expresión regular.
if (cadena.matches(".*1(?!2).*")) {
System.out.println("SI");
} else {
System.out.println("NO");
}
El método split de la
clase String es la alternativa a usar StringTokenizer para separa cadenas. Este
método divide el String en cadenas según la expresión regular que recibe. La
expresión regular no forma parte del array resultante.
Ejemplo 1:
String str = "blanco-rojo:amarillo.verde_azul";
String [] cadenas = str.split("[-:._]");
for(int i = 0; i<cadenas.length; i++){
System.out.println(cadenas[i]);
}
Muestra por pantalla:
blanco
rojo
amarillo
verde
azul
Ejemplo 2:
String str = "esto es un ejemplo de como funciona split";
String [] cadenas = str.split("(e[s|m])|(pl)");
for(int i = 0; i<cadenas.length; i++){
System.out.println(cadenas[i]);
}
Salida:
to
un ej
o de como funciona s
it
Excelente, agrego un aporte http://usandojava.blogspot.com/2013/08/expresiones-regulares-usando-java-parte.html
ResponderEliminarMe podríais ayudar diciendo que hace esta expresión regular?
ResponderEliminar(?<!('(.{0,10}))|("(.{0,10}))|(/\*(.{0,10})))(&\w+)(?!('(.*))|("(.*))|(/\*(.*)))
Gracias
Puedes probar tus expresiones regulares en:
Eliminarhttp://www.regexper.com/
cual seria una expresion valida en el ejemplo del correo porque le introduzco correos y no los acepta
ResponderEliminarEn la expresión se ha colado un espacio en blanco al final entre el $ y las comillas finales
Eliminar"^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ "
ese espacio sobra. Si lo quitas funciona correctamente. De todas formas ya lo he corregido en la entrada.
Gracias por avisar Jesus!!
como haria una expresion regular que me valide la direccion de una casa
ResponderEliminarejemplo avenida 11 # 6-27 el llano
Como valido que un String tenga la siguiente estrucutra
ResponderEliminarEl sistema debe validar que el valor para el campo “variables” sea igual a id=valorId|anio=Año|nombre=Nombre Cliente MP|; Un ejemplo del valor del campo variable es: id=16940075|anio=2013|nombre=HAROLD
muy buen blog, gracias
ResponderEliminarGracias por el comentario Juan Jose. Espero que lo sigas visitando y que te sea útil. Saludos
ResponderEliminarComo harias una expresion para validar while(condicion){sentencia}; donde donde sentencia se puede repetir n veces
ResponderEliminarHola me parece excelente este blog. Necesito ayuda con este programa que tengo que hacer en Netbeans 8.0 con una interfaz gráfica.
ResponderEliminarEjercicio 2:
La empresa “Juegos Felices” lo contrató para realizar un juego de ahorcado. Usted debe realizar dos módulos para este sistema.
El primer módulo es el ingreso de palabras para realizar el juego. Estas deberán almacenarse en un archivo de texto. El sistema debe controlar que la palabra a ingresar no exista previamente. También debe tener la posibilidad de borrar el contenido del archivo y dejarlo en blanco para que el usuario comience una nueva inserción de palabras.
El segundo módulo es el módulo de juego en el cual, el sistema seleccionará una palabra al azar y le irá preguntando al usuario letras, y verificará si la letra digitada se encuentra en la palabra, en caso contrario irá sumando la cantidad de intentos fallidos antes de perder. El usuario dispone de 7 oportunidades antes de perder.
Se recomienda que el archivo de texto sea un archivo de palabras separadas por espacios; y la elección de cual palabra preguntarle al usuario se realizará mediante un método aleatorio donde se especifique un número m que estará en el rango 1 a n. Donde n representa la cantidad de palabras en el archivo.
No entendi el punto 9 ".*1(?!2).*"
ResponderEliminarme lo podrian explicar?
Como demonios vas a referenciar en el punto 5 a la variable "mat" en el if???
ResponderEliminarGenial para los que nos estamos iniciando en las expresiones regulares. Me ha sacado de varios apuros. Saludos y gracias.
ResponderEliminarMe alegro de que te haya sido útil. Saludos y gracias por el comentario
EliminarGran aporte, de lo mejor en Expresiones Regulares en Java, gracias por tú tiempo y dedicación.
ResponderEliminarEste blog es increíble. Gracias por el esfuerzo, Enrique.
ResponderEliminaralguien podria decirme que regex utiliza para validar nombres españoles? con acentos, ñ, guiones para nombres compuestos, ª para abreviaciones de Maria ... etc.
ResponderEliminarGracias!
Hola como podría validar una contraseña de al menos 5 caracteres y debe estar compuesta por letras y numeros es decir ambos y sin caracteres especiales
ResponderEliminarAquí tienes unos ejemplos de validación:
ResponderEliminarhttp://www.contadordecaracteres.info/prueba-expresiones-regulares.html
esta herramienta que yo utilizo para comprobar las expresiones regulares y probar reemplazos de texto
y si quiero poner solo letras y el espacio???
ResponderEliminar"\D"
EliminarMuy buen aporte. Muchas gracias!
ResponderEliminarpor favor me ayudan que comienze con la letra a y no termine en b
ResponderEliminar"a.*(?!b)"
EliminarCordial Saludo
ResponderEliminarY si quiero que no haya mas de un espacio entre palabras
Es decir:
(ola k ase) es valido
(ola k ase) no es valido
aunque no es una validación lo que siempre hago es:
Eliminarcadena.remplace(" "," ");
Saludos a todos
ResponderEliminarsi es posible que alguien me pueda ayudar al validar una cadena
que no tenga espacios iniciales(que inicien con alguna palabra) y que no se puedan usar dobles espacios o mas
Como saber si toda una cadena tiene por lo menos una Mayuscula?
ResponderEliminarSaludos es muy buena informacion pero me perdi U.u
ResponderEliminarAyuda como hago para que me acepte funciones cubicas. Ejemplo
Que no me lea x^5 o que tenga cualquier numero antes de x^5 como 5x^5,2x^5 ayuda!!
Hola. Podrían ayudarme con el siguiente problema:
ResponderEliminar¿cual seria la expresión regular para validar solo 10 números o 10 dígitos de un numero de teléfono?.
Me podrian ayudar necesito una expresion regular que me valide un operador OR en java, osea que me acepte ||
ResponderEliminarMU CHIFO
ResponderEliminarPattern patronNumero = Pattern.compile("[^0-4]");
ResponderEliminarcomo puedo hacer para que solo me eliga un num de ese rango :(
Pattern patronNumero = Pattern.compile("[^0-4]");
ResponderEliminarcomo puedo hacer para que solo me eliga un num de ese rango :(
^[0-4]{1}
Eliminarcomo obtengo los valores aceptados por la expresión regular?
ResponderEliminarUn ID que está formado por 8 cifras, un guión y una letra
ResponderEliminarquien me ayuda a validar esta expresion regular
[0-8][-][a-z]
EliminarUn ID que está formado por 8 cifras, un guión y una letra
ResponderEliminarquien me ayuda a validar esta expresion regular
hay forma de simplificar este patron, compara los rangos de el valor de INT
ResponderEliminar("-(([0-9]{1,9})|(1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])|(20[0-9][0-9][0-9][0-9]"
+ "[0-9][0-9][0-9][0-9])|(21[0-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9])|(214[0-6][0-9][0-9][0-9][0-9][0-9]"
+ "[0-9])|(2147[0-3][0-9][0-9][0-9][0-9][0-9])|(21474[0-7][0-9]"
+ "[0-9][0-9][0-9])|(214748[0-2][0-9][0-9][0-9])|(2147483[0-5]"
+ "[0-9][0-9])|(21474836[0-3][0-9])|(214748364[0-8])|(([0-9]{1,9})|(1[0-9][0-9][0-9][0-9][0-9]"
+ "[0-9][0-9][0-9][0-9])|(20[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])|(21[0-3][0-9][0-9][0-9]"
+ "[0-9][0-9][0-9][0-9])|(214[0-6][0-9][0-9][0-9][0-9][0-9][0-9])|(2147[0-3][0-9][0-9][0-9]"
+ "[0-9][0-9])|(21474[0-7][0-9]"
+ "[0-9][0-9][0-9])|(214748[0-2][0-9][0-9][0-9])|(2147483[0-5]"
+ "[0-9][0-9])|(21474836[0-3][0-9])|(214748364[0-7]))");
una pregunta, estoy haciendo un software que reemplace palabras segun la que se ingrese.
ResponderEliminarque no debe de distinguir entre mayusculas y minusculas, poder modificar por ejemplo todas las palabra Uno, UNO,uno,uNo etc. por otra. use la expresion [\\w-]+ pero no se logra. espero resuelvan mi duda. gracias
Como hago para que me obligue a introducir una letra y un numero
ResponderEliminarMuy Util, Gracias!
ResponderEliminarHola, cómo haria para verificar todos los numeros menores a 17? Gracias
ResponderEliminarHola como haría para colocacar formato de fecha DDMMAA
ResponderEliminarComo hago para convalidar el caso que la expresion use &???
ResponderEliminarHola amigos me pueden ayudar como hago para validar un formato de fecha MM/DD/AA en el mes no pase de 12 y en los dias que no pase de 31 .
ResponderEliminarhe conseguido buscado en blooks el siguiente código \\d{2}/\\d{2}/\\d{2} pero si diguito 18/54/89 lo recibe como si no hubiera un error
gracias bro, buen aporte
ResponderEliminarMe puedes ayudar necesito realizar un programa en Java que pueda a través de expresiones regulares determinar en una cadena de entrada, a través de métodos es un digito, es un número entero, número decimal, es un carácter, un identificador, un operador matemático, operador lógico, delimitador, un carácter de puntuación
ResponderEliminarcomo puedo hacer una expresión regular para una notación científica, tengo esta, pero no he podido agregar la potencia
ResponderEliminar("([-+]?[0-9]*\\.?[0-9]+\\([eE][-+]?[0-9]+)?");
Hola me podrian ayudar a realizar una expresion con lo siguiente?
ResponderEliminarNombre (Deberá permitir ingresar el nombre completo de una persona con 1 o
nombres y sus 2 apellidos
Alguien tiene los códigos para un alaizador lexico para el idioma español?
ResponderEliminar