[Métodos] Java Mail - Parte I


JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. Implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc-

JavaMail no se incluye en la JDK ni en la JRE, sino que debe conseguirse como un paquete externo. Debe, además, descargarse adicionalmente el JavaBeans Activation Framework en caso de usar una JDK inferior a la versión 6.
Para descargarlo acostumbro usar el repositorio de maven :


Simplemente dando a click a 'download(JAR)', tmb se puede hacer un proyecto maven e incluir el trozo de codigo en el pom. Lo mismo para Java JavaBeans(TM) Activation Framework.

Incluyendo Dependencias


  1. Click en File desde el menú de archivos
  2. 'Project Structure' (CTRL + SHIFT + ALT + S on Windows/Linux, ⌘ + ; on Mac OS X)
  3. Seleccionar Modules en el panel de la izquierda.
  4. Vamos a la pestaña de 'Dependencies'
  5. hacemos click en '+' y luego → JARs or directories
  6. Buscamos nuestros JARs y listo!

Desde el viejo y querido Eclipse:
  1. Click derecho sobre el projecto y luego en 'propiedades'
  2. Luego vamos a el menu de la izquierda sobre Java Build Path
  3. Pestaña de 'Librerias' o 'Libreries' en nglés.
  4. Hacemos click sobre el botón de la derecha Add External JARs...
  5. Buscamos la ubicación y Listo

Para hacer lo propio desde NetBeans:


  1. Primero deberemos crear una libreria que contenga los JARs y luego agregar el mismo. Para ello vamos a menu 'tools' y sobre el menu desplegable damos a la opcion de Librarys
  2. en la parte inferior izquierda damos click sobre el boton New Library...


  3. Procedemos a darle un nombre que la identifique.
  4. Siguiente paso, sobre la pestaña de 'Classpath' vamos a hacer click sobre el boton Add JAR/Folder...


  5. Buscamos el jar donde se encuentre.
  6. Aceptamos y listo!

Otra manera es hacer de nuestro proyecto un Proyecto Maven, dejando que este se encargue de todas las dependencias configurando el archivo XML.


Configurando el MAIL

Unas de las cuestiones de usar por ejemplo GMAIL es que previamente hay que setearle un nivel de seguridad 'bajo' que nuestra aplicacion pueda hacer uso automatizado de cuenta.
Para ello vamos a el enlace: myaccount.google.com
Despues de loguearse, hay que ir a la opcion de 'Acceso y Seguridad'
Y en la opcion de 'Permitir el acceso a aplicaciones menos seguras', movemos el swicth para que si.

[Métodos] Como verificar que exista una conexión a internet desde Java

Cómo verificar que exista una conexión a internet desde Java




Para verificar que exista una conexión a internet con java, existen 3 enfoques:


  • No comprobar nada
  • Conectar a algun sitio con java.net.InetAddress
  • Utilizar java.lang.Process para hacer un ping



No hacer nada



Asi es, ¿para qué comprobamos que exista un conexión a internet?

Para evitar ejecutar un proceso que requiera del acceso a internet cuando no está disponible. Pero todo método de conexión a la red lanzará una exception de entrada/salida cuando esto no sea posible, teniendo que ser concientes ubicar la lógica en procesos de reconexión. De lo contrario estariamos testeando gratuitamente el acceso a los servidores de google o algun otro sitio irrelevante, sin asegurar que la conexión a la cual queremos acceder siga sin estar disponibles.

Si el sitio al que queremos acceder podemos tener el control, es aceptable enviar un pequeño resquest a un endpoint que devuelve una sencilla respuesta para garantizar que la comunicación es posible, al estilo 'ping'-'pong'




InetAddress.isReachable()



InetAddress representa una dirección de protocolo de internet (Internet Protocol o IP), se instancia a través de la su método éstatico InetAddress.getByName(String host), pasando en el string de parámetro una ip.

El método de interés es isReachable(int timeout), el cuál recibe un tiempo de espera para determinar si es posible conectarse a el sitio especificado en la instancia.


     public static void sendPingRequest(String ipAddress) throws IOException {
        imprimir("Enviando solicitud Ping a: " + ipAddress);
        InetAddress inetAddress = InetAddress.getByName(ipAddress);

        if (inetAddress.isReachable(5000)) {
            System.out.println("El destino es alcanzable");
            System.out.println("Canonical HostName: " + inetAddress.getCanonicalHostName());
            System.out.println("HostName: " + inetAddress.getHostName());
            System.out.println(inetAddress.toString());
        } else {
            System.out.println("No se pudo alcanzar este sitio!");
        }
    }
 

Ejecutando este método con localhost '127.0.0.1', la ip de google argentina '172.217.162.3' y esta la invertimos un poco '172.162.217.30'


Sending Ping Request to 127.0.0.1
Host is reachable
Canonical HostName: 127.0.0.1
HostName: 127.0.0.1
127.0.0.1/127.0.0.1



java.lang.Process



Process representa un proceso nativo del sistema instanciada por ProccessBuilder que recibe como argunmentos en su constructor una lista de String siendo cada uno de ellos una instrucción a ejecutar, muy similar a ejecutar un linea de comandos.


    public static void commands(String ipAddress) throws IOException {
        List<String> commandList = new ArrayList<>();
        commandList.add("ping");
        commandList.add(ipAddress);

        ProcessBuilder build = new ProcessBuilder(commandList);
        Process process = build.start();

        InputStream isin = process.getInputStream();
        Reader readerIsin = new InputStreamReader(isin);
        BufferedReader input = new BufferedReader(readerIsin);
        InputStream iser = process.getInputStream();
        Reader readerIser = new InputStreamReader(iser);
        BufferedReader error = new BufferedReader(readerIser);
        String s = null;

        System.out.println("Standard output: ");
        while ((s = input.readLine()) != null) {
            System.out.println(s);
        }

        if((s = error.readLine()) != null) {
            System.out.println("Errors output: ");
            do {
                System.out.println(s);
            } while ((s = error.readLine()) != null);
        }
    }
 

Standard output:

Haciendo ping a 127.0.0.1 con 32 bytes de datos:
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128

Estad¡sticas de ping para 127.0.0.1:
Paquetes: enviados = 4, recibidos = 4, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
M¡nimo = 0ms, M ximo = 0ms, Media = 0ms

[MySQL] Mas Funciones MySQL - FIRST - LAST - UCASE - LCASE - MID - LENGTH - ROUND - NOW

Otras funciones que resultaria interesante ir conociendo, para hallar un registro de una columna acorde al primer y ultimo caracter o número, pasarlo a mayúsculas o minúsculas, hacer una subcadena, medir su longitud, redondear números, obtener el tiempo o darle un formato son:

  • FIRST()
  • LAST()
  • UCASE()
  • LCASE()
  • MID()
  • LENGTH()
  • ROUND()
  • NOW()




FIRST() y LAST()


Las declaraciones FIRST y LAST nos permite encontrar el primer registro alfabético ó númerico y el ultimo respectivamente.
Su sintaxis tiene la forma:

SELECT FIRST(nombre_columna) FROM nombre_tabla;

El 'primero' o el 'último' se refiere simplemente a quien tenga el primer caracter del alfabeto o númerico.
Por ejemplo, podemos obtener el último 'ID' para conocer cúal sería el siguiente. Otro ejemplo

  SELECT FIRST (pais) AS 'Primer país' , LAST (pais) AS 'Último país' FROM dar10.usuarios ;

De tener una lista con todos los paises habidos y por haber el resultado podria ser el siguiente:

Primer país Último país
Abjasia Zimbabue





UCASE() y LCASE()


Las funciones UCASE y LCASE nos permite convertir las cadenas de caracteres a 'minúsculas' ó 'mayúsuclas' respectivamente independientemente de la forma en que haya sido guardadas.
Donde UCASE significa 'UPPER-CASE' (mayúsculas) y LCASE se refiere a 'Lower-Case' (minúsculas).

Su sintaxis tiene la forma:

SELECT UCASE(nombre_columna) FROM nombre_tabla;

El 'primero' o el 'último' se refiere simplemente a quien tenga el primer caracter del alfabeto o númerico.
Por ejemplo, podemos obtener el último 'ID' para conocer cúal sería el siguiente. Otro ejemplo

  SELECT UCASE (pais) AS 'En Mayúsculas' , LCASE (pais) AS 'En Minúsculas'
FROM dar10.usuarios WHERE id = 1;

Estas funciones nos convierten las cadenas de caracteres a mayúculas ó minúsculas independientemente de como estén escritas en la base.

En Mayúsculas En Minúsculas
ARGENTINA argentina

Como es natural, estas funciones solo funcion convirtiendo caracteres alfabeticos y no númericos, por lo cual no tendrá efecto sobre estos últimos caracteres.





MID()


La funcion MID funciona de la misma manera que como lo hace el método
public String substring(int beginIndex, int endIndex) de la clase String .

Su sintaxis tiene la forma:

SELECT MID(nombre_columna, indice_inicio, indice_fin) FROM nombre_tabla;

Del mismo que el método substring la funcion MID recibe 2 parametros adicionales al nombre de la columna a la cual quiero fraccionar la cadena de caracteres. Por ejemplo, una forma sencilla de obtener un sufijo o abreviatura de un pais en nuestra base de datos seria:

  SELECT MID (pais, 1, 3) AS 'abreviatura' , pais FROM dar10.usuarios;


abreviatura pais
arg argentina
bra brasil
bol bolivia
chi chile
col colombia
ecu ecuador
par paraguay
per perú
uru uruguay
ven venezuela

A diferencia de java, el indice NO comienza por cero sino por uno.
El segundo se puede obviar ya que por defecto es la longitud total de la cadena.





LENGTH()


La funcio LENGTH se utliza para medir la longitud total del campo de la columna ingresada.

Su sintaxis tiene la forma:

SELECT LENGTH(nombre_columna) FROM nombre_tabla;

  SELECT LENGTH (pais) AS 'Longitus' , pais FROM dar10.usuarios WHERE id = 1;


Longitud pais
9 argentina

Como es natural, estas funciones solo funcion convirtiendo caracteres alfabeticos y no númericos, por lo cual no tendrá efecto sobre estos últimos caracteres.





ROUND()


La funcion ROUND nos sirve para redondear las columnas que contengan principalmente los tipo DOUBLKE FLOAT DECIMAL, etc

Su sintaxis tiene la forma:

SELECT ROUND(nombre_columna) FROM nombre_tabla;

Por supuesto al no encontrar valores decimales o aplicarlos a cadena de caracteres, nos devolvera '0'. un pequeño ejemplo:

  SELECT ROUND (precio) AS 'Redondeado' , precio FROM dar10.venta ;

Estas funciones nos convierten las cadenas de caracteres a mayúculas ó minúsculas independientemente de como estén escritas en la base.

Redondeado precio
9.99 10
1.5 2
33.11 33






NOW()


La funcion NOW nos genera un registro adicional util para determinar en la tabla la fecha de la consulta. tiene el formato
yyyy-MM-dd HH:mm:ss
Su sintaxis tiene la forma:

NOW()

Esta funcion no recibi parametros, y puede llegar a ser util para agregar informacion a la consulta, No tiene mucho sentido ejecutarla sola ya que nos devolviria la misma informacion una y otra vez hasta alcanzar el número de registros totales

  SELECT NOW () AS 'Fecha de consulta' , pais FROM dar10.usuarios;

Fecha de consulta pais
2016-08-23 20:39:59 argentina

Como es natural, estas funciones solo funcion convirtiendo caracteres alfabeticos y no númericos, por lo cual no tendrá efecto sobre estos últimos caracteres.





[MySQL] Funciones de Agrupamiento COUNT - SUM - MAX - MIN - AVG

Funciones de agrupamiento

Los motores de base de datos nos ofrece funciones preestablecidas para agrupar los resultados de nuestras consultas para asi poder sumar numericamente, establecemer un maximo o un minimo, promediar, etc.
Estas funciones de agrupamiento son:
  • COUNT()
  • SUM()
  • MAX()
  • MIN()
  • AVG()
Todas estas funciones se usan junto con la declaración 'SELECT FROM', su sintaxis tiene la forma:

SELECT FUNCION(nombre_columna) FROM nombre_tabla;




COUNT()


La declaración COUNT nos permite contar literalmente la cantidad de registro que iremos encontrando para una columna que especificamos como parámetro de la función.
Su sintaxis tiene la forma:

SELECT COUNT(nombre_columna) FROM nombre_tabla;

La forma de usar esta funcion es con la declaración SELECT, nombrar a la funcion

  SELECT COUNT (pais) FROM dar10.usuarios ;

Esta consulta nos devolverá la cantidad total de registros que contenga la tabla, aunque sus registros sean nulos , los cuenta igual.
Lo interesante de esta funcion es aplicar algunas condiciones como contar la cantidad de registros que contenga tal valor en una columna, como por ejemplo:

  SELECT COUNT (pais) FROM dar10.usuarios WHERE pais = 'argentina' ;





SUM()


La declaración SUM nos permite sumar númericamente valores para una columna que especificamos como parámetro de la función.
Su sintaxis tiene la forma:

SELECT SUM(nombre_columna) FROM nombre_tabla;

SUMAR no implica explicitamente valores del tipo numericos, se puede hacer con columnas que contengan valores puramente letras, es decir del tipo alfanumericos.

  • Si lo hacemos con columnas que no contienen numeros, la suma dará el resultado de '0' (Cero)
  • Si lo aplicamos a campos que contienen valores alfanumericos, nos sumará solamente los números, aunque probablemente nos dará un resultado que no esperemos.
  • Lo mas normal, es usar la declaración SUM con columnas del tipo númerico.

  SELECT SUM (edad) AS 'Suma de edades' FROM dar10.usuarios WHERE edad => 15 ;





MAX() - MIN()


La declaraciones MAX y MIN nos dice a simple vista que que es lo que hacen.
Su sintaxis es igual a las anteriores:

SELECT MAX(nombre_columna) FROM nombre_tabla;

Al que SUMAR, para encontrar el maximo o minimo nos referimos a valores numericos, o alfanumericos pero solo tomara la parte numerica si la hay, de lo contrario el resultado será vacio. Ejemplo.


  SELECT MAX (edad) AS 'Maximo' , MIN (id) AS 'Minimo' FROM dar10.usuarios ;

NOTA: al tratarse de columnas, se separan mediantes comas ',' independientemente o no que se le apliquen funciones para su visualización.





AVG()


AVG es una abreviación de 'average' a lo que en español viene siendo 'promedio'.

Al igual que el resto de las funciones 'númericas' funciona mejor con columnas que sean de ese tipo, para columnas alfanumericas, solo tomará en cuenta esa parte y para los caracteres saldra un resultado de vacio. Ejemplo:

SELECT AVG(nombre_columna) FROM nombre_tabla;

Un pequeño ejemplo:

  SELECT AVG (edad) AS 'Promedio de Edades' FROM dar10.usuarios ;





[Métodos] Abrir un navegador desde Java

Abrir navegador predeterminado con Java


Para abrir un un navegador con código en java, bastará con pensar un poco y con saber:



Determinar Sistema


Muy resumidamente para determinar el sistema:

 System.getProperty("os.name");

Utilizar consola para abrir un ejecutable


  • Para abrir el navegador por defecto que tenga instalado 'windows'

    rundll32 url.dll,FileProtocolHandler + url

  • Para hacer lo propio en la termina de algunas de las distribuciones de 'linux'

    x-www-browser + url
    xdg-open + url
    sensible-browser + url

  • En sistemas operativos de la marca de la manzanita, como 'OSX'

    open + url

Ejecutar Consola con código java


Para ejecutar la consola desde java se utiliza el siguiente trozo de código donde el comando depende del sistema operativo.

 Runtime.getRuntime().exec(String command);




Abrir navegador predeterminado con código java


Para poder tener unos metodos, los cuáles abran una ventana del navegador predeterminado del sistema o uno especifico a la url que le definamos como parámetro:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.zubaray;
import java.io.IOException;

public class OpenBrowser {
    private String direccion = "https://dar10comyr.blogspot.com.ar/";

    //NAVEGADOR POR DEFECTO POR SISTEMA
    public void abrirNavegadorPredeterminadorWindows(String url) throws IOException{
        Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
    }
    public void abrirNavegadorPredeterminadorLinux(String url) throws IOException{
        Runtime.getRuntime().exec("xdg-open " + url);
    }
    public void abrirNavegadorPredeterminadorMacOsx(String url) throws IOException{
        Runtime.getRuntime().exec("open " + url);
    }

    //NAVEGADOR POR DEFECTO GENERICO
    public void abrirNavegadorPorDefecto(String url) throws IOException{
        String osName = System.getProperty("os.name");
        if(osName.contains("Windows"))
            abrirNavegadorPredeterminadorWindows(url);
        else if(osName.contains("Linux"))
            abrirNavegadorPredeterminadorLinux(url);
        else if(osName.contains("Mac OS X"))
            abrirNavegadorPredeterminadorMacOsx(url);
        else{ //INFORMAR SISTEMA NO SOPORTADO }
    }

    // MAIN
    public static void main(String[] dar10) throws IOException {
        OpenBrowser op = new OpenBrowser();
        op.abrirNavegadorPorDefecto(op.direccion);
    }
}

[MySQL] INSERT - UPDATE - DELETE

Para llevar a cabo las tareas de consulta o modificación de los datos contenidos en las Bases de Datos se utiliza el Lenguaje de Manipulación de datos, conocido por sus siglas en inglés DLM ('Data Language Manipulation'). Esas clausulas son, ademá de Select: INSERT; UPDATE y DELETE


Recordar que por otra parte para definir el contenido de la base de datos, se utiliza el Lenguaje de Definición de Dato, conocido por sus siglas en inglés DDL (' Data Definition Language'), las cuales era: CREATE, ALTER y DROP




INSERT


La declaración INSERT nos permite insertar registro en nuestra tabla de la base de datos.
Seguida de la declaracion INTO mas el nombre de la tabla, solo hay que tener en cuenta que hay el valor de campos en el orden en que fueron espeficados y que sólo NO podrán omitirse aquellos que fueron declarados NOT NULL
Su sintaxis tiene la forma:

INSERT INTO nombre_tabla
VALUES (valor1,valor2,valor3,...);

Otra variente es tambien especficar el nombre de las columnas se utilizan:

INSERT INTO nombre_tabla (nombre_columna1, nombre_columna2, nombre_columna3, ...)
VALUES (valor1,valor2,valor3,...);

NOTA: Hay que notar que el campo ID es utoincremental, por ende tomará el siguiente valor al ultimo que se haya ingresado o bien el ultimo según esté configurado.
Pequeño ejemplo:

  INSERT INTO `dar10`.`usuarios` (`nombre_usuario`, `mail`, `pais`)
VALUES ('dar10', 'dar10@comyr', 'argentina');

Valores NULL y NOT NULL

null significa "dato desconocido" o "valor inexistente".
No es lo mismo que un valor 0, una cadena vacía o una cadena literal "null" es decir que contenga las letras 'n' 'u' y 2 'l' como texto. A veces, puede desconocerse o no existir el dato correspondiente a algún campo de un registro. En estos casos decimos que el campo puede contener valores nulos.





UPDATE


Para editar un registro existente se usa la clausula UPDATE-SET-WHERE.

UPDATE nombre_tabla
SET nombre_columna = nuevo_valor, ...
WHERE nombre_columna = valor_existente;

Al hacer un UPDATE le indicamos el nombre de la tabla que vamos a modificar, le decimos que 'setee' en tal columna un nuevo valor, y para encontrar el registro que queremos modificar le damos una condicion con WHERE, generalmente suele ser el ID.

Pequeño ejemplo:

  UPDATE `dar10`.`usuarios`  
SET `mail`='dar10@comyr.com'  
WHERE `id`='52';





DELETE


Para borrar un registro se utiliza la declaración DELETE FROM-WHERE.
Su sintaxis es:

DELETE FROM nombre_tabla
WHERE nombre_columna = valor_existente;

Al igual que pasaba con UPDATE, para borrar necesitamos indicar desde donde vamos a eliminar un registro con DELETE FROM seguido del nombre de la table y una condicion con WHERE para que encuentre ese registro, generalmente también el ID.

Pequeño ejemplo:

 DELETE FROM `dar10`.`usuarios`
WHERE `id`='52';



[Métodos] Copiar y pegar desde el portapapeles en java

Para poder copiar y pegar desde el portapapeles del sistema con java vamos a hacer uso de de las siguientes clases e interfaz, por lo cual va a ser necesario importarlas:





Copiar



Procedimiento


Lo primero que debemos hacer para copiar del portapapeles es acceder al método de clase de toolkit getDefaultToolkit:

Luego debemos llamar a otro método de esta clase, getSystemClipboard:


Ahora usaremos un método de la clase ClipBoard que devuelve una instancia de la clase Transferable:


Proximo paso es usar el método de la interfaz transferable, getTransferData:


Por ultimo, como me resulta mas facil, casteo el Objet a String




Toolkit tool = Toolkit.getDefaultToolkit();
Clipboard clip = tool.getSystemClipboard();
Transferable trans = clip.getContents(null);
Object objeto = trans.getTransferData(DataFlavor.stringFlavor);
String str = (String) objeto;



De igual manera podemos ahorranos unos pasos, pero para mi es menos claro como se suceden las cosas realmente, en la practica no importará como se llegue al resultado.

Pegar



Procedimiento


Primer paso (no tan obvio) debemos tener nuestro String o cualquiera objeto que podamos llevarlo a string para pasarselo por parámetro del constructor del StringSelection

Ahora creamos el objeto de la clase StringSelection desde su único constructor:
Lo siguiente, es repetir los pasos:
  • crear el kit de herramientas por defecto del sistemas
  • este objeto llamará al método getSystemClipBoard() y devolvera un clipBoard
  • este nuevo objeto quien llamará al método set para modificar el portapales:
Será el objeto de la clase ClipBoard que lamé a su método sin retorno pasando el StringSelection como parametro:
  • public void setContents(Transferable contents, ClipboardOwner owner)
    • Establece el contenido actual del portapapeles al objeto transferable especificado y registra el dueño del portapapeles como el propietario de los nuevos contenidos.
    • Parámetros:
    • Transferable contents - El contenido del objeto transferibles que representa el contenido del portapapeles.
      ClipBoardOwner owner - el objeto que posee el contenido del portapapeles, o null si no es nadie.




String aPegar = "Este es el texto a pegar en el portapapeles";
StringSelection ss = new StringSelection(aPegar);
Toolkit tool = Toolkit.getDefaultToolkit();
Clipboard clip = tool.getSystemClipboard();
clip.setContents(ss, null);




public void pegarPortapapeles(String pegado){
    StringSelection ss = new StringSelection(pegado);
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);  
}
public String copiarPortapapeles() throws UnsupportedFlavorException, IOException {
    Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
    String copiado = (String) t.getTransferData(DataFlavor.stringFlavor);
    return copiado;
}

[Métodos] Expresión Regular


RegEx


RegEx ('Regular Expression' en inglés) según la Wikipedia es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones.

Ademas pone un lindo ejemplo:


l grupo formado por las cadenas Handel, Händel y Haendel se describe con el patrón "H(a|ä|ae)ndel"

La verdad yo no entendi mucho, y agrega:


n informática, las expresiones regulares proveen una manera muy flexible de buscar o reconocer cadenas de texto.




Básicamente podemos decir que una expresión regular es un codigo raro como:

  ([a-zA-Z]\w*?)

Pero nos permite a través de esos caracteres con operadores, palabras, o secuencia de caracteres que deseamos encontrar si no conocemos bien con exactitud lo que estamos buscando dentro de una cadena de texto.

En java usamos las clases del paquete java.util.regex:




Una manera de invocar expresiones regulares es:

  String cadena = "aaaaab";
  Pattern p = Pattern.compile("a*b");
  Matcher m = p.matcher(cadena);
  boolean b = m.matches();

El booleano deberia devolver true ya que buscamos:

  • a* que contega la letra 'a' un número indeterminado de veces con el operador '*'
  • b seguido de una letra 'b'
Dicha expresión regular se encuentra dentro de la cadena de texto que buscamos y por lo tanto la condicion termina siendo verdadera.
Otra manera de invocar una expresión regular en una sola línea es:

  boolean b = Pattern.matches(String regex, CharSequence input);

De la misma manera que lo hace la clase String :
  public boolean matches(String arg0) {
         return Pattern.matches(arg0, this);
  }

Pasando como parámetros la expresión regular como un String y nuestro texto como una clase que implemente la interfaz CharSequence, las cuales son:



Resumen de las construcciones de expresiones regulares


Patrón Igualación a Descripción
x el caracter x Una letra cualquiera se iguala a la misma.
[abc] letra a ó b ó c cual quier palabra que contenga alguna de las letras dentro del corchete.
[^abc] cualquier caracter excepto la 'a' 'b' 'c' el operador ^ es de negación, aunque la palabra contenga la 'a', matcheara con las otras letras.
[a-zA-Z] cualquier letra desde la 'a' hasta la 'z' rango de valores desde la primera letra a la segunda en minúsculas y mayúsculas.
[a-d[m-p]] cualquier letra desde la 'a' hasta la 'd' y también desde la 'm' a la 'p' unión de rangos de valores distintos.
[a-z&&[def]] cualquier letra desde la 'a' hasta la 'z' que sean iguales a 'd','e' y 'f' intersección de rangos de letras.
[a-z&&[^bc]] cualquier letra desde la 'a' hasta la 'z' excepto las letras 'b' y 'c' Substracción de rango de letras.
[a-z&&[^m-p]] cualquier letra de la 'a' a la 'z' excepto el rango de de 'm' a 'p' idem anterior pero con un rango de letras.
. Cualquier caracter (no solo letras) _Comodin para todos los caracteres.
\d un digito de 0 a 9 rango numerico decimal.
\D un no digito de 0 a 9 (letras y caracteres) negación de un rango númerico de 0 a 9.
\s un espacio en blanco similar a los tipos: [ \t\n\x0B\f\r]
\S un NO espacio en blanco la mayúscula es negación.
\w similar a [a-zA-Z_0-9] un caracter alfanúmerico
\W un NO caracter alfanúmerico negacion de [^/w]
^ El principio de una linea operador que indica agrega información al patrón
$ final de la línea operador que indica agrega información al patrón
\b limite de una palabra operador que indica agrega información al patrón
\B un NO limite de una palabra operador que indica agrega información al patrón
\A el principio de un input operador que indica agrega información al patrón
\G el final del macheo anterior operador que indica agrega información al patrón
\Z el final de una linea (\n \r\n \r \u0085 \u2028 \u2029) operador que indica agrega información al patrón
\z el final de un input operador que indica agrega información al patrón
X? X, al menos una vez o ninguna vez ? cuantificar una o ninguna
X* x cero veces o más * cuantificador cero o más
X+ X al menos una vez o más veces + cuantificador una o más
X{n} X 'n' veces exactamente el número de n veces
X{n,} X al menos el número de n veces cuantificador n veces o más
X{n,m} X n veces y no mas de m veces cuantificador de rango entre n y m veces (n<m)




Ya una vez empezando a entender como funcionan los patrones, solo queda jugar con los métodos de la clase Matcher


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public boolean expReg(String patron, String texto){
    Pattern p = Pattern.compile(patron);
    Matcher m = p.matcher(texto);
    return m.matches();
}

public static String expReg(String patron, String texto){
    Pattern p = Pattern.compile(patron);
    Matcher m = p.matcher(texto);
    if(m.matches())
    return m.replaceAll("EEE");
    else
    return "El patrón no se encontraba en el texto";
}






ReGex Java Online


Otra manera de aprender y encontrar patrones de expresión regular es con los regex online para java.

Entre muchos otros, y solo online sino tambien como plugins de IDEs o version desktop, pero por ejemplo:



Regexe

[Métodos] Conversiones de fechas

Para convertir estos tipos de fecha, tenemos una ruta preparada y en gral empleo una clase para luego importarla, crear un objeto y usar sus metodos:




 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Conversionador {
    public String date2String(Date miDate, String formato){
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        String miString = sdf.format(miDate);
        return miString;
    }
    public Date string2Date(String miString, String formato) throws ParseException{
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        Date miDate = sdf.parse(miString);
        return miDate;
    }

    public String calendar2String(Calendar miCalendar10, String formato){
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        String miString = sdf.format(miCalendar10.getTime());
        return miString;
    }
    public Calendar string2Calendar(String miString, String formato) throws ParseException{
        SimpleDateFormat sdf = new SimpleDateFormat(formato);
        Calendar miCalendar10 = Calendar.getInstance();
        miCalendar10.setTime(sdf.parse(miString));
        return miCalendar10;
    }

    public Date calendar2Date(Calendar miCalendar10){
        Date miDate = miCalendar10.getTime();
        return miDate;
    }
    public Calendar date2Calendar(Date miDate){
        Calendar miCalendar10 = Calendar.getInstance();
        miCalendar10.setTime(miDate);
        return miCalendar10;
    }
}

Con esta clase y estos métodos seremos capaz de convertir entre:

  • Date2String(Date miDate, String formato) (Date a String)
    • Parámetros:
      • miDate: el Date a convertir
      • formato: el formato que tendrá el String resultante.
  • String2Date(String miString, String formato) (String a Date)
    • Parámetros:
      • miString: el String a convertir
      • formato: el formato que tiene el String que convertiremos.
    • Arroja
    • ParseException

  • calendar2String(Calendar miCalendar10, String formato) (Calendar a String)
    • Parámetros
      • miCalendar10: el calendario a convertir a String
      • formato: el formato que tendrá el String resultante.
  • string2Calendar(String miString, String formato)
    • Parámetros
      • miString: el String que convertiremos a Calendar
      • formato: el formato que tiene el String que convertiremos.
    • Arroja
    • ParseException
  • calendar2Date(Calendar miCalendar10)
    • Parámetro
      • miCalendar10: el calendario a convertir a Date
  • date2Calendar(Date miDate)
    • Parámetros
      • miDate: el Date que convertiremos a Calendar

  • Java 25 de 2025