some image

Tag Java

Extraer contenido con expresiones regulares

Etiquetas: , Blog, Programación No comments

Bien, en algún momento todos hemos escuchado sobre las expresiones regulares y la magia que hacen para verificar si se cumple la expresión y así mismo realizar validaciones. Por otro lado, las expresiones regulares nos permiten también extraer contenido de esas gigantescas cadenas de texto, ayudándonos a simplificar la codificación y reducir unas cuantas lineas de código.

 

Sé que este es un ejemplo sencillo, pero muy útil para todos aquellos que en algún momento buscan la forma de extraer el contenido de un texto utilizando expresiones regulares :).

 

1. Código fuente

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ContentExtractorRegularExpression {
    
    private final String REGULAR_EXPRESION_VOWELS = "[aeiouAEIOU]";
    private final String REGULAR_EXPRESION_NUMBERS = "\\d";
    private final String REGULAR_EXPRESION_P_TAG_HTML = "

(.+?)

"; private final String REGULAR_EXPRESION_NOT_EXISTS = "[y]"; /** * Extract the vowels in the text * * @param text * @return */ public String getVowels(String text){ StringBuilder result = new StringBuilder(); Pattern pattern = Pattern.compile(REGULAR_EXPRESION_VOWELS); Matcher matcher = pattern.matcher(text); while(matcher.find()){ result.append(matcher.group()).append(","); } return (!result.toString().isEmpty()) ? result.substring(0,result.toString().length() - 1) : "Not exists content with the regular expression " + REGULAR_EXPRESION_VOWELS; } /** * Extract the numbers in the text * * @param text * @return */ public String getNumbers(String text){ StringBuilder result = new StringBuilder(); Pattern pattern = Pattern.compile(REGULAR_EXPRESION_NUMBERS); Matcher matcher = pattern.matcher(text); while(matcher.find()){ result.append(matcher.group()).append(","); } return (!result.toString().isEmpty()) ? result.substring(0,result.toString().length() - 1) : "Not exists content with the regular expression " + REGULAR_EXPRESION_NUMBERS; } /** * Extract the elements which are a tag expression element * @param text * @return */ public String getTagElements(String text){ StringBuilder result = new StringBuilder(); Pattern pattern = Pattern.compile(REGULAR_EXPRESION_P_TAG_HTML); Matcher matcher = pattern.matcher(text); while(matcher.find()){ result.append(matcher.group(1)).append(","); } return (!result.toString().isEmpty()) ? result.substring(0,result.toString().length() - 1) : "Not exists content with the regular expression " + REGULAR_EXPRESION_P_TAG_HTML; } /** * This method should return the Not exist content with the regular expression * * @param text * @return */ public String getNotExistRegularExpression(String text){ StringBuilder result = new StringBuilder(); Pattern pattern = Pattern.compile(REGULAR_EXPRESION_NOT_EXISTS); Matcher matcher = pattern.matcher(text); while(matcher.find()){ result.append(matcher.group()).append(","); } return (!result.toString().isEmpty()) ? result.substring(0,result.toString().length() - 1) : "Not exists content with the regular expression " + REGULAR_EXPRESION_NOT_EXISTS; } public static void main(String[] args) { String text = "Hace 1 millon de años en la tierra existia una raza " + "de seres extraordinarios con muchos poderes, solo 4 fantasticos " + "tenian la capacidad de dominar todos los elementos. " + "

Cocoman

,

RockMan

, entre otros."; ContentExtractorRegularExpression example = new ContentExtractorRegularExpression(); System.out.println("Text : " + text + "\n"); System.out.println(example.getVowels(text)); System.out.println(example.getNumbers(text)); System.out.println(example.getTagElements(text)); System.out.println(example.getNotExistRegularExpression(text)); } }

 

2. Salida

Text : Hace 1 millon de años en la tierra existia una raza de seres extraordinarios con muchos poderes, solo 4 fantasticos tenian la capacidad de dominar todos los elementos. 

Cocoman

,

RockMan

, entre otros. a,e,i,o,e,a,o,e,a,i,e,a,e,i,i,a,u,a,a,a,e,e,e,e,a,o,i,a,i,o,o,u,o,o,e,e,o,o,a,a,i,o,e,i,a,a,a,a,i,a,e,o,i,a,o,o,o,e,e,e,o,o,o,a,o,a,e,e,o,o 1,4 Cocoman,RockMan Not exists content with the regular expression [y]

Creación de dibujo simple con el método paintComponent

Etiquetas: , , , , , Blog, Programación 1 comment

Captura de pantalla 2015-06-18 00.15.24

 

Puede que la creación de dibujos simples en JAVA no sea muy útil en el campo laboral de un programador promedio, aún así es un buen ejercicio aprender algo nuevo sobre la interfaz gráfica de usuario (GUI) y de paso poder profundizar mas en el uso de los ciclos repetitivos while (ya verán porque).

Además de todo lo anterior es de gran ayuda entender como funciona el sistema de coordenadas y como se puede ubicar un punto en el contenedor del programa.

Para empezar hay que tener en cuenta que el sistema de coordenadas empieza desde la esquina superior izquierda donde las parejas ordenadas vendrían siendo (0,0) y finaliza en el último punto de la pantalla de la esquina inferior derecha donde las parejas ordenadas son el tamaño de ancho y alto de la aplicación.

Basado en lo dicho anteriormente se puede escoger el punto inicial y final de nuestro dibujo, sin embargo puedes preguntarte… Que pasaría si cambias el tamaño de la ventana de tu aplicación?.

La respuesta es que tu dibujo no se re-acomodaría al nuevo tamaño de la pantalla y posiblemente quede volando o sobrando según sea el caso. Por ese motivo se deben de crear dos variables que puedan traer el ancho y alto de la aplicación y después de esto con la formula porcentual puedes escoger el inicio y final de tu dibujo.

Teniendo claro esto ya se puede entrar a jugar con los ciclos repetitivos while y crear la figura o dibujo que se desea, yo decidí hacer una c dentro de dos etiquetas (mayor que y menor que ) que vendría siendo un sencillo logo de codes and tags, acá les va el código…

Clase que crea el panel

 

package codesdraw;
import javax.swing.JPanel;
import java.awt.Graphics;

//Clase CodesPanel hereda todos los componentes de la clase JPanel
public class CodesPanel extends JPanel{
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        //Se obtiene el ancho y alto de la aplicación
        int anchura = getWidth();
        int altura = getHeight();
        //Se definen los puntos X y Y que eventualmente serán cambiados según sea el caso
        int puntoInicioX =  (anchura / 100) * 15;
        int puntoInicioY =  (altura / 100) * 60;
        //la variable recorrido es el espacio que habrá entre cada nuevo caracter del dibujo
        int recorrido =  (anchura / 100) * 2;
        //Los limites son utilizados para determinar el final del dibujo
        int limite1 = (anchura / 100) * 50;
        int limite2 = (anchura / 100) * 60;
        int limite3 = (altura / 100) * 45 ;
        int limite4 = (altura / 100) * 77 ;
        int limite5 = (anchura / 100) * 45 ;
        int limite6 = (anchura / 100) * 65 ;
        //Variables tipo String que contienen el caracter que tendrán las imagenes
        String caracter1 = "*";
        String caracter2 = "+";


        //Ciclos while que crean la figura de la etiqueta
        while(puntoInicioX < limite1){
            g.drawString(caracter1, puntoInicioX, puntoInicioY);
            puntoInicioX += recorrido;
            puntoInicioY -= recorrido;
        }

        puntoInicioX =  (anchura / 100) * 15;
        puntoInicioY =  (altura / 100) * 60;

        while(puntoInicioX < limite1){             g.drawString(caracter1, puntoInicioX, puntoInicioY);             puntoInicioX += recorrido;             puntoInicioY += recorrido;         }         puntoInicioX =  (anchura / 100) * 95;         puntoInicioY =  (altura / 100) * 60;         while(puntoInicioX >= limite2){
            g.drawString(caracter1, puntoInicioX, puntoInicioY);
            puntoInicioX -= recorrido;
            puntoInicioY -= recorrido;

        }

        puntoInicioX =  (anchura / 100) * 95;
        puntoInicioY =  (altura / 100) * 60;

        while(puntoInicioX >= limite2){
            g.drawString(caracter1, puntoInicioX, puntoInicioY);
            puntoInicioX -= recorrido;
            puntoInicioY += recorrido;

        }

        //Ciclos while que dibujan la C dentro de las etiquetas < >

        puntoInicioX =  (anchura / 100) * 65;
        puntoInicioY =  (altura / 100) * 50;
        while(puntoInicioY > limite3){
            g.drawString(caracter2, puntoInicioX, puntoInicioY);
            puntoInicioY -= recorrido;

        }



        puntoInicioX =  (anchura / 100) * 65;
        puntoInicioY =  (altura / 100) * 45;
        while(puntoInicioX > limite5){
            g.drawString(caracter2, puntoInicioX, puntoInicioY);
            puntoInicioX -= recorrido;
        }



        puntoInicioX =  (anchura / 100) * 47;
        puntoInicioY =  (altura / 100) * 45;
        while(puntoInicioY < limite4){
            g.drawString(caracter2, puntoInicioX, puntoInicioY);
            puntoInicioY += recorrido;

        }

        puntoInicioX =  (anchura / 100) * 47;
        puntoInicioY =  (altura / 100) * 77;
        while(puntoInicioX < limite6){
            g.drawString(caracter2, puntoInicioX, puntoInicioY);
            puntoInicioX += recorrido;

        }


    }
}

Clase principal

package codesdraw;


import javax.swing.*;
import java.awt.*;

public class CodeDraw {
    public static void main(String args[]){
        //Se instancia la clase CodePanel
        CodesPanel panel = new CodesPanel();
        JFrame aplicacion = new JFrame();
        //Se agrega el panel dentro del JFrame
        aplicacion.add(panel);
        //Cambio color del fondo y la letra
        panel.setBackground(Color.black);
        panel.setForeground(Color.green);
        aplicacion.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //tamaño de la ventana
        aplicacion.setSize(350,350);
        aplicacion.setVisible(true);

    }
}

Acá puedes descargar el proyecto desde mi repositorio en GITHUB —> paintComponent

 

Para terminar me gustaría compartir otro ejemplo algo mas complejo del uso que se le puede dar al método paintComponent.

Captura de pantalla 2015-06-18 00.23.48

Creando un JFrame desde cero

Etiquetas: , , Blog, Programación No comments

 

Captura de pantalla 2015-06-04 22.56.35

Si estás comenzando en el gran mundo de JAVA (como yo), alguna ves te habrás preguntado como hacer gráfico e interactivo tu programa… Quizás habrás visto algunos vídeos en Youtube donde muestran como fácilmente  y con unos cuantos clicks haces una interfaz gráfica usando la opción de crear un nuevo JFrame Form que traen algunos IDE’s (Yo lo hice).

El punto es que cuando revisas el código e intentas entenderlo puede ser algo complejo para ti (Si es que ahora estás comenzando). Por esa razón tome la decisión de investigar como rayos se puede hacer un Frame desde cero y aquí les va.

/**
* Programa: TuJFrame.java
* Autor: Juan Gómez
* Blog: Codes and Tags
* Fecha: 05/06/2015
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class TuJFrame extends JFrame{
    //Se declaran atributos
    private Container contenedor;
    private JLabel titulo, juan, edwin, nombreJuan, nombreEdwin;
    private ImageIcon imagen1, imagen2;
    private JButton boton;
    public TuJFrame() {
        //Se creal el contenedor del panel que tendra todos los elementos
        contenedor = getContentPane();
        contenedor.setBackground(Color.white); //Se le asigna el color blanco al fondo del contenedor;
        titulo = new JLabel("Codes and Tags");
        titulo.setFont(new Font("Arial", Font.BOLD, 28)); // Cambio en el tipo de fuente
        imagen1 = new ImageIcon("images/edwin.png"); // Se crea un nuevo objeto tipo icono que contendra la imagen ubicada en la dirección "images/edwin.jpg"
        edwin = new JLabel(imagen1);// El JLabel "edwin" tendrá como contenido el ImageIcon "imagen1"
        imagen2 = new ImageIcon("images/juan.png");
        juan = new JLabel(imagen2);
        nombreEdwin = new JLabel("Edwin Torres");
        nombreEdwin.setFont(new Font("Arial", Font.ITALIC, 16));
        nombreEdwin.setVisible(false); // Por el momento no es visible el contenido del JLabel "nombreEdwin"
        nombreJuan = new JLabel("Juan Gomez");
        nombreJuan.setFont(new Font("Arial", Font.ITALIC, 16));
        nombreJuan.setVisible(false);
        boton = new JButton("Pulsame!");
        //Se define como nulo el Layout
        contenedor.setLayout(null);
        //Se le agregan los objetos al contenedor y luego se le asignas las posiciones a estos.
        contenedor.add(titulo).setBounds(250,10, 250, 40);
        contenedor.add(edwin).setBounds(42, 80, 287, 286);
        contenedor.add(juan).setBounds(359, 80, 287, 288);
        contenedor.add(nombreEdwin).setBounds(135, 386, 100, 20);
        contenedor.add(nombreJuan).setBounds(452, 386, 100, 20);
        contenedor.add(boton).setBounds(288, 430, 100, 20);

        //Evento para cuando se haga click sobre el boton cambie el estado del setVisible a "true" de los objetos nombreEdwin y nombreJuan
        // y al final muestre un mensaje en un JOption.
        boton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nombreEdwin.setVisible(true);
                nombreJuan.setVisible(true);
                JOptionPane.showMessageDialog(null, "Ves lo fácil que es crer tu propio JFrame..");
            }
        });

    }
    public static void main(String args[]){
        //Se instancia la clase
        TuJFrame mostrar = new TuJFrame();
        //Se asigna un tamaño al JFrame
        mostrar.setSize(680,530);
        //Se muestra el JFrame
        mostrar.setVisible(true);
        //Activa la opción de cerrar la ejecución del programa con la (X)
        mostrar.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }
}

Y después de hacer click en el botón…VOILÀ!

Captura de pantalla 2015-06-04 23.36.19

Puedes descargar el proyecto desde mi repositorio — > JFrame desde cero

Usando FreeMarker como generador de Plantillas

Etiquetas: , Blog, Programación No comments

Estos días tuve la necesidad de realizar el envio de emails utilizando plantillas, el dilema es que fue necesario utilizar una estrategía para facilitar el trabajo. Las opciones eran FreeMarker y Velocity. Después de consultar Pros y Contras de ambas librerias, decidí optar por FreeMarker, ya que el proyecto sigue arriba mientras que Velocity “has gone” :( . Bien entonces ahora sí vamos al grano.

1. ¿Qué es FreeMarker?

FreeMarker es en pocas palabras un “Motor de Plantillas”  escrito en lenguaje Java, el cuál nos permite a partir de una Plantilla (Template) y una serie de Parametros (Parameters), obtener el contenido de una plantilla procesada. Esta libreria puede ser descargada de la página oficial o en caso de querer utilizarlo con un gestor de administración de proyectos como Maven, la dependencia es :

    

  org.freemarker
  freemarker
  2.3.20

 

2. Ejemplo

Bien, a continuación coloco un código de ejemplo

package org.codesandtags;

import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.IOException;
import java.io.StringReader;
import java.util.Locale;

/**
 * Clase de ejemplo utilizando FreeMarker para obtener
 * un Template procesado a partir de una cadena de texto
 *
 * Created by codesandtags on 27/05/2015.
 */
public class FreeMarkerExample {

    private Configuration configuration;
    private Template template;

    public FreeMarkerExample(){
        configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
        configuration.setLocale(Locale.US);
    }

    public Configuration getConfiguration() {
        return configuration;
    }

    public Template getTemplate() {
        return template;
    }

    public void setTemplate(Template template) {
        this.template = template;
    }

    public void setContentTemplate(String name, String content){
        try {
            template = new Template(name, new StringReader(content), getConfiguration());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Clase de Prueba

package org.codesandtags;

import freemarker.template.TemplateException;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by codesandtags on 27/05/2015.
 */
public class FreeMarkerExampleTest {

    @Test
    public void generateTemplateTest(){
        FreeMarkerExample example = new FreeMarkerExample();
        StringBuilder content = new StringBuilder("Hello ${user},")
                .append("\nthis is an example using FreeMarker. ")
                .append("\nThe list of names are :  ")
                .append("\n<#list names as name>  ")
                .append("\n  ${name_index + 1}. ${name} ")
                .append("\n  ");

        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("user", "Codes and Tags");
        parameters.put("names", new ArrayList(Arrays.asList("Cocoman", "Juan", "Edwin")));

        try {
            example.setContentTemplate("exampleTemplate", content.toString());
            Writer out = new StringWriter();
            example.getTemplate().process(parameters, out);
            Assert.assertNotNull(out);
            System.out.println(out.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
    }

}

Salida generada una vez se ha procesado la plantilla con sus parámetros

Hello Codes and Tags,
this is an example using FreeMarker. 
The list of names are :  
  1. Cocoman 
  2. Juan 
  3. Edwin 

 

3. Descargar Ejemplo desde GitHub

https://github.com/codesandtags/freemarker-example

Git Logo

GitHub Codes and Tags

4. Referencias

http://freemarker.org/
http://www.vogella.com/tutorials/FreeMarker/article.html
http://www.javabeat.net/freemarker-template-hello-world-example/
http://viralpatel.net/blogs/freemaker-template-hello-world-tutorial/

Validar numero en Java con expresiones regulares

Etiquetas: Blog, Programación No comments

Una de las operaciones más comunes cuando se trabaja con datos, es validar si un dato es numérico o no. Existen diferentes formas de hacerlo, una de ellas muy común es utilizar una expresión regular al tratar de realizar un parseInt, parseLong o parseDouble. Sin embargo cuando no necesitamos crear metodos adicionales en nuestras clases, podemos recurrir rapidamente a nuestros mejores amigos para manejo de cadenas : “Las Expresiones Regulares”.

El ejemplo mostrado a continuación presenta otra alternativa para realizar validaciones de números utilizando expresiones regulares, a partir del método maches de la clase String :).

Código

public class ValidarNumero {

	public static void main(String[] args) {

		ValidarNumero ejemplo = new ValidarNumero();

		// # Realizando validaciones a un numero

		// Numero con un espacio
		System.out.println(ejemplo.validar(" 123456"));
		// Numero con un caracter especial (punto)
		System.out.println(ejemplo.validar("12.3456"));
		// Con un caracter especial (coma)
		System.out.println(ejemplo.validar("10,0001"));
		// Numero valido
		System.out.println(ejemplo.validar("3465756"));
		// Numero con una letra (A)
		System.out.println(ejemplo.validar("10000A"));
		// Cadena vacia
		System.out.println(ejemplo.validar(""));

		// # Eliminando caracteres no correspondientes a un numero

		// Numero con un espacio
		System.out.println(ejemplo.convertir(" 123456"));
		// Numero con un caracter especial (punto)
		System.out.println(ejemplo.convertir("12.3456"));
		// Con un caracter especial (coma)
		System.out.println(ejemplo.convertir("10,0001"));
		// Numero valido
		System.out.println(ejemplo.convertir("3465756"));
		// Numero con una letra (A)
		System.out.println(ejemplo.convertir("10000A"));
		// Cadena vacia
		System.out.println(ejemplo.convertir(""));

	}

	public boolean validar(String cadena) {
		if (cadena.matches("[0-9]*")) {
			return true;
		} else {
			return false;
		}
	}

	public int convertir(String numero) {
		// Se reemplazan todos los caracteres que no correspondan a un numero
		// por espacio
		numero = numero.replaceAll("[^0-9]", "");

		// Si la cadena queda vacia
		if (numero.equals("")) {
			numero = "0";
		}

		return Integer.parseInt(numero);
	}

}

Salida

false
false
false
true
false
true
123456
123456
100001
3465756
10000
0