martes, 29 de abril de 2014

Aprendiendo a programar en java usando el valor de π(pi)





Saludos a todos.

Hace muchísimo tiempo cuando curioseaba el lenguaje Pascal y antes de dormir me puse a pesar en la geometría del circulo y recordé las clases de colegio donde me decían que el valor de pi no era mas que la longitud de la circunferencia dividida entre su diámetro.





Tenia presente que midiendo la circunferencia y el diámetro de un plato redondo por ejemplo solo hallaría un valor aproximado de pi, y que dicho valor más exacto sólo lo podían hacer los matemáticos y sus demostraciones, cosa que difícilmente lograría yo.

Siempre he sido regular en matemáticas, para algunos muy bueno, la verdad no lo creo; pero sí me consideraba mejor en la geometría y dibujo técnico.

De tanto pensar en círculos, matemática y geometría llego a mi una forma de hallar el valor de pi sin hacer demostraciones, gracias a que recordé que había leído en alguna parte la teoría que mas o menos dice "Un circulo es una figura geométrica con muchos lados que equidistan de un centro o eje"

Se me prendió el bombillo, me dije, tomare un cuadrado del cual conozco su diámetro y le agregare más lados calculado de los ya existentes sin cambiar el diámetro del mismo, es decir que el diámetro sera una constante; la suma de sus lados me darían el perímetro el cual dividiría por el diámetro y me daría el valor aproximado de pi, si hago esto muchas veces me acercaré cada vez más a pi; en otras palabras le agregare más lados al cuadrado tratando de convertirlo en un circulo.

Tome lápiz, cuaderno y comencé ha calcular, para el caso de un cuadrado de diámetro 1 los lados medirían 0,707106781, ya que según Pitágoras:

h^2 = co^2 + ca^2

Como para un cuadrado sus lados son igual, es decir sus catetos, nos quedaría:

h^2 = co^2 + co^2

h^2 = 2 * co^2

Sacamos raíces a ambos términos de cada igualdad

h = √2 * co

finalmente

co = h/√2

siendo la hipotenusa nuestro diámetro y remplazando...

co = 1/√2 = 0,707106781;

Listo ya tengo los datos de mi cuadrado, como los cuadrados tienen 4 lados el perímetro sería (0,707106781 * 4) = 2,828427125

Nuestro primer valor aproximado para pi seria:

2,828427125/1 = 2,828427125

2,828427125 es un valor muy distante al verdadero valor de pi; lo que sigue ahora es usando geometría agregarle más lados a figura y calcularlos sin cambiar el diámetro (1) y recalcular el valor de pi; en la practica debía recalcular miles de veces para llegar a un valor decente de pi.

Hosting

Tome nuevamente mi cuaderno y lápiz, y escribir un programa en Pasca (en esa época no tenia computador, así que me tocaba a papel y compilar en mi cabeza) para luego esperar el sábado que tenia nuevamente contacto con un computador; para sorpresa mía el día que pase mi programa a computador funciono sin problemas dándome el valor de pi tal cual una calculadora, estaba muy excitado al llegar muy cerca al valor de pi sin ser matemático.

Como mencione al inicio, eso paso hace mucho tiempo; y hoy que empece a recordar me ha sido duro reconstruir el programa, sospecho que es por mi pereza de hacer algo dos veces, así que investigue algo que me ayudara a recordar y me tope conque ya eso lo habían hecho Arquimedes y lo llamó Método exhaustivo, aunque mi método es ligeramente distinto, así que más pereza me da reconstruirlo, pero en un futuro lo haré para ustedes.

Pero como es costumbre escribir código en cada una de mis entradas, me tope con la Fórmula de Leibniz que no es más que una sumatoria que tiende al infinito y que es fácil programar.


//Autor Rey Salcedo
class FormulaLeibniz{
 public static double formula(int repeticiones){
  double pi = 0;
  for(int n = 0;n < repeticiones;n++){
   pi += ((Math.pow(-1,n))/(2*n + 1));
  }
  return pi*4;
 }
 public static void main(String[] args){
  System.out.println(formula(100000000));
 }
} 

Espero le sirva y les sea de agrado



jueves, 10 de abril de 2014

Conversión de binario a decimal, de decimal a binario y operaciones con números binarios


Conversión de binario a decimal, de decimal a binario y operaciones con números binarios.

El sistema numérico binario es muy importante para la computación debido a que los sistemas de computo actuales en su gran mayoría sólo pueden hacer operaciones aritméticas con unos y ceros, y cuando digo sistemas de computo no solo me refiero a PC de escritorio y portátiles, sino que también smartphone, tables, incluso calculadoras electrónicas de mano, entre otros dispositivos; y la razón del uso de binarios es la facilidad al momento de realizar operaciones aritméticas y el descubrimiento de materiales que pueden trabajar entre voltajes y ausencia de los mismo de manera precisa,.

Ahora cabe la pregunta, ¿Cómo éstos dispositivos pueden hacer tantas cosas solo usando ceros y unos?, diré que en un comienzo los sistemas de computo no hacían muchas cosas, operaban con ceros y unos y solo científicos, matemáticos, físicos y programadores comprendían las respuestas de estos equipos de luces titilantes, luego las cosas se tornaron complejas y recurrieron a simplificar largas secuencias de ceros y unos en comandos, algo así como lenguajes memotécnicos; luego inventaron el ensamblador, luego lenguajes más fáciles de codificar, luego siguieron muchos más, pasaron por los orientados a objetos y siguen evolucionando; ésta evolución a dado entornos más complejos y cosas más interesantes que luces titilantes; lo anterior es una respuesta personal y resumida, te invito a investigar más.

Antes de pasar a abordar el tema de los números binarios, trataremos sobre el sistema decimal y como hacemos para combinarlos entre si y formar cifras más grandes.

La razón por la que usamos un sistema basado en diez dígitos (0,1,2,3,4,5,6,7,8,9) son meramente históricas, no hay una razón matemática para que esto sea así.



La siguiente figura representa el mecanismo o método que usamos a diario para contar y generar numero decimales.


De igual forma podemos hacer conteos en otra bases, el siguiente ejemplo aplica para el sistema binario con la única variante que, la caja no puede tener 2 o más elementos


En el siguiente gráfico confrontaré los dos conteos en sistema decimal y binario respectivamente, el resultado final está representando la misma cantidad pero en bases distintas, es decir 10 base 10 = 1010 base 2.


Listo, ahora tratemos el tema de la conversión de decimal a binario y viceversa; usando Java es muy facíl ya que prácticamente está resuelto usando la clase Integer como podemos ver en el codigo a continuación.

class Conversion{
 public static void main(String []args){
  //De binario a decimal
  String numeroBinario = "1010";
  int num=Integer.parseInt(numeroBinario,2);
  System.out.println(numeroBinario + " base 2 = " + num + " base 10");
  
  //De decimal a binario
  int numeroDecimal = 10;
  String binario = Integer.toBinaryString(numeroDecimal); 
  System.out.println(numeroDecimal + " base 10 = " + binario + " base 2");
 }
} 

Pero veamos ahora como se resuelve este tipo de conversión usando papel y lápiz.


Decimal a binario
Se divide el número del sistema decimal entre 2, cuyo resultado entero se vuelve a dividir entre 2, y así sucesivamente hasta que el dividendo sea menor que el divisor, 2. Es decir, cuando el número a dividir sea 1 finaliza la división.

A continuación se ordenan los restos empezando desde el último al primero, simplemente se colocan en orden inverso a como aparecen en la división, se les da la vuelta. Éste será el número binario que buscamos (Explicación de wikipedia).


Binario a decimal
Para realizar la conversión de binario a decimal, realice lo siguiente:

Inicie por el lado derecho del número en binario, cada cifra multiplíquela por 2 elevado a la potencia consecutiva (comenzando por la potencia 0, 20).

Después de realizar cada una de las multiplicaciones, sume todas y el número resultante será el equivalente al sistema decimal. (Explicación de wikipedia).

Ejemplos:
(Los números de arriba indican la potencia a la que hay que elevar 2)




Ya para terminar les ofrezco el código que he escrito más operaciones basica con números binarios, espero les guste.


public class Ejercicio{
 public static int dinarioADecimal(String numeroBinario){
  int longitud = numeroBinario.length();//Numero de digitos que tiene nuestro binario
  int resultado = 0;//Aqui almacenaremos nuestra respuesta final
  int potencia = longitud - 1;
  for(int i = 0;i < longitud;i++){//recorremos la cadena de numeros
   if(numeroBinario.charAt(i) == '1'){
    resultado += Math.pow(2,potencia);
   }
   potencia --;//drecremantamos la potencia
  }
  return resultado;
 }
 
 public static String decimalABinario(int numeroDecimal){
  int temp = numeroDecimal;
  String resultado = "";
  while (temp != 0){
   if(temp % 2 == 0){
    resultado = "0" + resultado;
   }else{
    resultado = "1" + resultado;
   }
   temp = temp / 2;
  }
  return resultado;
 }
 
 public static String operacionBinaria(char operador,String numero1, String numero2){
  int n1Decimal = dinarioADecimal(numero1);
  int n2Decimal = dinarioADecimal(numero2);
  if(operador == '+'){
   return (decimalABinario(n1Decimal + n2Decimal));
  }else if(operador == '-'){
   return (decimalABinario(n1Decimal - n2Decimal));
  }else if(operador == '*'){
   return (decimalABinario(n1Decimal * n2Decimal));
  }else{
   return ("null");
  }
 }
 
 public static String sumaBinaria(String numero1,String numero2){
  return (operacionBinaria('+',numero1,numero2));
 }
 
 public static String sumaBinaria(String numero1,String numero2,String numero3){
  return sumaBinaria(sumaBinaria(numero1,numero2),numero3);
 }
 
 public static String restaBinaria(String numero1,String numero2){
  return (operacionBinaria('-',numero1,numero2));
 }
 
 public static String multiplicacionBinaria(String numero1,String numero2){
  return (operacionBinaria('*',numero1,numero2));
 }
 
 public static void main(String []args){
  System.out.println("-----De binario a decimal-----");
  System.out.println(dinarioADecimal("101010"));
  
  System.out.println("-----De decimal a binario-----");
  System.out.println(decimalABinario(10));
  
  System.out.println("-----Sumando dos binarios-----");
  System.out.println(sumaBinaria("101010","111000"));
  
  System.out.println("-----Sumando tres binarios-----");
  System.out.println(sumaBinaria("101010","111000","101010"));
  
  System.out.println("-----Restando dos binarios-----");
  System.out.println(restaBinaria("101010","111000"));
  
  System.out.println("-----Multiplicando dos binarios-----");
  System.out.println(multiplicacionBinaria("101010","111000"));
 }
}

Esperando serles de ayuda.

lunes, 21 de octubre de 2013

Aprender a programar unsando arreglo y matrices en java





Aunque ya en entradas antiguas he publicado ejemplos con arreglos y matrices usando java,  faltó hacer un pequeño tutorial del uso de los mismo, y digo pequeño porque en Internet hay mucha información sobre éste tema y mi interés es redactar un artículo fácil de entender que te ayudará a crear una base sólida y comprender ejemplos más complejos con los que te puedas topar en el futuro.

Podemos empezar definiendo arreglos como una colección de cosas, donde ésas cosas pueden ser variables u objetos, para el caso que Java solo puedes guardar en un arreglo un tipo de variable u objeto.

Los arreglos se usan para almacenar datos y posteriormente recuperarlos fácilmente y cómodamente, por ejemplo si deseamos tener a la mano una lista de nombres de personas podemos crear un arreglo de tipo String, si queremos almacenar una lista de valores enteros podemos crear un arreglo de tipo int, si queremos tener una lista de personas podemos crear un arreglo de tipo Persona; así puedes hacer lista de botones (JButton), iconos (Icon) y cualquier cosa que necesites.

Una de las características que hay que tener en cuenta al momento que usar un arreglo es que se debe especificar la cantidad de elementos que vamos a almacenar, en otras palabras especificar su tamaño; si intentamos almacenar más de lo que puede soportar el arreglo se generará una excepción y al tiempo un error de lógica.

Figura que usaremos para representar arreglos
Hosting

Usando código, para crear una arreglo usamos la siguiente sintaxis:

<tipo_variable_u_objeto> <nombre_arreglo>[];

y para inicializar el arreglo y especificar su tamaño usamos la siguiente sintaxis:

<nombre_arreglo> = new <tipo_variable_u_objeto>[tamaño]; 

cabe aclarar que podemos crear el arreglo e inicializar al mismo tiempo así:

<tipo_variable_u_objeto> <nombre_arreglo>[] = new <tipo_variable_u_objeto>[tamaño];

Algo muy importante que  tenemos que tener en cuenta antes de pasar con los ejemplos, es que cuando inicializamos nuestro arreglo cada espacio es llenado con valores predeterminados, para el caso que nuestro arreglo sea de tipo número serán llenados con ceros (0) y sin son objetos con valores nulos (null), en la categoría de objetos se incluyen los de tipo String.

Para almacenar o acceder a las posiciones de un arreglo usamos indices que para Java inician en 0 y terminan en (tamaño_del_arreglo - 1) .

Imaginemos que necesitamos almacenar una lista de 5 números y luego mostrarlos en la pantalla, el código nos quedaría de la siguiente forma:

public class EjemploArreglo{
 public static void main(String args[]){
  int arregloDeNumeros[];//Creamos en arreglo
  int tamaño = 5;
  
  arregloDeNumeros = new int[tamaño];//Inicializamos y establecemos un tamaño
  
  //demostramos que el valor predeterminado es 0
  System.out.println("Predeterminado para la posicion 0 => " + arregloDeNumeros[0]);
  
  arregloDeNumeros[0] = 2;//Almacenando en la posicion 0
  arregloDeNumeros[1] = 54;//Almacenando en la posicion 1
  arregloDeNumeros[2] = 56;//Almacenando en la posicion 2
  arregloDeNumeros[3] = 45;//Almacenando en la posicion 3
  arregloDeNumeros[4] = 78;//Almacenando en la posicion 4
  
  System.out.println("Imprimiendo en pantalla");
  for(int i = 0;i < tamaño;i++){ //Recorremos el arreglo tantas veces con elementos tenga
   System.out.println(arregloDeNumeros[i]);
  }
 }
}




Cabe anotar que también que podemos llenar nuestro arreglo con nuestros propios valores predeterminados que es igual que decir "inicializarlo con valores de manera implícita", así:
public class EjemploArreglo{
 public static void main(String args[]){
  int arregloDeNumeros[] = {2,54,56,45,78};
  
  //De ésta forma podemos saber el tamaño de cualquier arreglo
  //Util cuando el usuario final establece el tamaño y deseamos conocerlo
  int tamaño = arregloDeNumeros.length;
  
  System.out.println("Tamaño del arreglo " + tamaño);
  
  System.out.println("Imprimiendo en pantalla");
  for(int i = 0;i < tamaño;i++){ //Recorremos el arreglo tantas veces con elementos tenga
   System.out.println(arregloDeNumeros[i]);
  }
 }
}

Lo expuesto hasta aquí es básico pero suficiente para que pruebes con otros tipos de objetos y variables distinto a numero (int), recorrer los elementos y modificarlos.

Ahora pasemos a las matrices, también llamadas tablas y más técnicamente arreglos bidimensionales; aunque suene un poco extraño una matriz es un array de array's, es decir un arreglo que contiene arreglos, para ilustrar mejor veamos la siguiente figura.

Representación de matrices
Si miramos el ejemplo anterior, tenemos una matriz de 8 filas y 8 columnas, Java vería algo así:

[ [A][B][C][D][E][F][G][H] ],
[ [A][B][C][D][E][F][G][H] ],
[ [A][B][C][D][E][F][G][H] ],
[ [A][B][C][D][E][F][G][H] ],
[ [A][B][C][D][E][F][G][H] ],
[ [A][B][C][D][E][F][G][H] ],
[ [A][B][C][D][E][F][G][H] ],
[ [A][B][C][D][E][F][G][H] ]

La forma de crear, inicializar y recorrer una matriz de este tipo es:

public class EjemploArreglo{
 public static void main(String args[]){
  String matrizDeLetras[][];
  int filas = 4;
  int columnas = 3;
  matrizDeLetras = new String[filas][columnas];
  
  //String matrizDeLetras[][] = new String[4][3]; podemos crear e inicializar de una vez
  
  matrizDeLetras[0][0] = "A";
  matrizDeLetras[0][1] = "B";
  matrizDeLetras[0][2] = "C";
  
  matrizDeLetras[1][0] = "D";
  matrizDeLetras[1][1] = "E";
  matrizDeLetras[1][2] = "F";
  
  matrizDeLetras[2][0] = "G";
  matrizDeLetras[2][1] = "H";
  matrizDeLetras[2][2] = "I";
  
  matrizDeLetras[3][0] = "J";
  matrizDeLetras[3][1] = "K";
  matrizDeLetras[3][2] = "L";
  
  for(int i = 0;i < filas;i++){//El incremento de la i representa el paso por las filas
   for(int j = 0;j < columnas;j++){//El incremento de la j representa el paso por cada columna de i fila
    System.out.print(matrizDeLetras[i][j]);//Imprimimos en pantalla el valor de fila i, columna j
   }
   System.out.println();//Damos un salto de linea
  }  
 }
}




Hasta ahora lo visto aquí sobre matrices muestra que cada fila tiene un número homogéneo o iguales de columnas, a éste tipo de matrices se les denomina matrices regulares, y como te puedes imaginar existe una contraparte llamada matrices irregulares en las cuales el número de columnas por filas es distinto; usare la siguiente figura para ilustrar.

Representación de una matriz irregular
Si miramos el ejemplo anterior, tenemos una matriz de 5 filas, Java vería algo así:

[ [A] ],
[ [B][C][D] ],
[ [E][F] ],
[ [G] ],
[ [H][I][J] ]

La forma de crear, inicializar, llenar y recorrer una matriz irregular la describo en el siguiente código:

public class EjemploArreglo{
 public static void main(String args[]){
  String matrizDeLetrasIrregular[][];
  int filas = 5;
  
  matrizDeLetrasIrregular = new String[filas][];
  
  matrizDeLetrasIrregular[0] = new String[1];//Le asignamos a la fila cero, una columna
  matrizDeLetrasIrregular[1] = new String[4];//Le asignamos a la fila uno, cuatro columnas
  matrizDeLetrasIrregular[2] = new String[2];//Le asignamos a la fila dos, dos columnas
  matrizDeLetrasIrregular[3] = new String[1];//Le asignamos a la fila tres, una columna
  matrizDeLetrasIrregular[4] = new String[3];//Le asignamos a la fila cuatro, tres columnas
  
  //Llenamos la primera fila
  matrizDeLetrasIrregular[0][0] = "A";
  
  //Llenamos la segunda fila
  matrizDeLetrasIrregular[1][0] = "B";
  matrizDeLetrasIrregular[1][1] = "C";
  matrizDeLetrasIrregular[1][2] = "D";
  matrizDeLetrasIrregular[1][3] = "E";
  
  //Llenamos la tercera fila
  matrizDeLetrasIrregular[2][0] = "F";
  matrizDeLetrasIrregular[2][1] = "G";

  //Llenamos la cuarta fila
  matrizDeLetrasIrregular[3][0] = "H";

  //Llenamos la quinta fila
  matrizDeLetrasIrregular[4][0] = "I";
  matrizDeLetrasIrregular[4][1] = "J";
  matrizDeLetrasIrregular[4][2] = "K";
  
  //matrizDeLetrasIrregular.length me indica cuantas filas tiene la matriz
  for(int i = 0;i < matrizDeLetrasIrregular.length;i++){
   //matrizDeLetrasIrregular[i].length me indica cuantas columnas tiene la matriz en la fila i
   for(int j = 0;j < matrizDeLetrasIrregular[i].length;j++){
    System.out.print(matrizDeLetrasIrregular[i][j]);//Imprimimos en pantalla el valor de fila i, columna j
   }
   System.out.println();//Damos un salto de linea
  }  
 }
}

Para terminar quiero agregar que de la misma forma como recorremos las listas y matrices para imprimir sus valores en pantalla, podemos usarlo de manera similar para llenarlos.

Espero sus comentario y sugerencias.

Como siempre, esperando serles de utilidad.



domingo, 1 de septiembre de 2013

Aprendiendo a programa en Java usando BlueJ






BlueJ es una aplicación de tipo IDE bastante útil  tanto para profesores como para aprendices, a mi modo de ver nos ayuda a crear bases solidas acerca de la programación orientada a objetos, ya que en la medida que vamos programando nos va mostrando el esquema o diseño final de tu aplicación; ademas de lo dicho anteriormente, genera una buena practica del uso de comentarios en nuestro código lo cual lo hará mas fácil de entender para otro programador o incluso para nosotros mismos.

Por simplicidad, podemos suponer que el aprendiz tendrá una herramienta menos confusa y más practica para aprender a programar en java.

Hosting

La aplicación esta disponible para muchas plataformas, incluso puedes descargarlo tipo .jar, aquí les dejo el link para la descargar del ejecutable y otro con un tutorial oficial en español del mismo.


Ademas les dejo este vídeo creado por Manuel Tezozomoc Lopez Fosado que nos permite darle un vistazo de las posibilidades de BlueJ.





lunes, 26 de agosto de 2013

Ebooks gratis en español para descargar, primera parte





La Universidad Abierta de Catalunya pone a disposición documentos digitales de muy buena calidad, he leído varios y hoy quiero compartir con ustedes una lista con varios documentos en formato digital listos para ser descargados.

Espero les guste y los compartan con sus amigos.




  










Pagina 1,Pagina2



sábado, 17 de agosto de 2013

Expresiones regulares usando Java, parte I





Al programar, muchas veces nos vemos en la necesidad de validar si ciertas cadenas de textos cumplen o no con un patrón especifico, por ejemplo, saber si un texto esta compuesto en su totalidad por números, generalmente lo resolvemos de la siguiente forma:

public boolean esNumero(String cadena){
  try {
     Integer.parseInt(cadena);
     return true;
  } catch (Exception e) {
     return false;
  }
}

O tal vez así:

public boolean esNumero(String cadena){
    char numeros[] = {'1','2','3','4','5','6','7','8','9','0'};
    boolean bandera = true;
    for(char charCadena:cadena.toCharArray()){
        boolean banderaTemp = false;
        for(char charNumero:numeros){
            if(charCadena != charNumero){
            banderaTemp |= false;
        }else{
            banderaTemp |= true;
        }
    }
        bandera &= banderaTemp;
    }
    return bandera;
}

En otros casos necesitamos buscar fragmentos de textos en cadenas muchos más largas, por ejemplo, si estamos construyendo un editor de texto en java lo podemos hacer así:

public int buscarPosicionInicio(String cadenaABuscar,String cadenaDondeBuscar){
    int pos = cadenaDondeBuscar.indexOf(cadenaABuscar);
    if(pos == -1){
        System.out.println("El texto no fue encontrado");
    }
    return pos;
}

Admito que el código anterior pudo haber salido mas corto.

Para finalizar, muchas veces nos topamos con la necesitad de extraer textos o quizás remplazarlo de una cadenas más larga, estos dos últimos casos seria lo mismo, extraer un texto es equivalente a remplazarlo por una cadena vacía ("").

Los métodos que anteriormente escribí puede que sean de mucha utilidad, pero hay una técnica que nos facilita la resoluciones de problemas de este tipo y además nos agrega robustez a nuestros programas, dicha técnica hace uso de algo llamado Expresiones Regulares.

Hosting

EXPRESIONES REGULARES
En el área de la programación las expresiones regulares son un método por medio del cual se pueden realizar búsquedas dentro de cadenas de caracteres. Sin importar si la búsqueda requerida es de dos caracteres en una cadena de 10 o si es necesario encontrar todas las apariciones de un patrón definido de caracteres en un archivo de millones de caracteres, las expresiones regulares proporcionan una solución para el problema. Adicionalmente, un uso derivado de la búsqueda de patrones es la validación de un formato específico en una cadena de caracteres dada, como por ejemplo fechas o identificadores. Por Wikipedia

El uso de expresiones regulares no es nada difícil, basta con decir que en muchas ocasiones hacemos uso de ellas sin darnos cuenta, por ejemplo, si queremos referirnos a cualquier archivo de extensión jpg solemos expresarlo asi "*.jpg", si queremos buscar archivos de textos que empiecen con la letra "a" lo hacemos con la expresión "a*.txt"; lo anterior es una de las forma en que hacemos uso de las expresiones regulares en la informática, aunque poco a poco y según nuestras necesidades estas se harán más complejas, pero con práctica y dedicación lograremos comprenderlo y aplicarlo en nuestros proyectos.

Antes de empezar con ejemplos de expresiones regulares usando Java, sugiero descargar la aplicación kiki las cual esta disponible tanto para Windows como para Gnu/Linux, en mi caso particular solo hay que usar el Centro de software de Ubuntu y listo.

Captura de Kiki en acción

Anotaciones para usar kiki




Existen una seria de normas para construir de manera correcta nuestras expresiones regulares para java y estas las podemos ver recopiladas en la pagina oficial  de Oracle http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html, aunque están en ingles al traducirla se entiende muy bien; usaremos las más usadas que nos darán bases para posteriormente abarcar las demás.

[abc] Representa un carácter que puede
ser 'a' ó 'b' ó 'c'.
[^abc] Representa cualquier carácter
excepto 'a' y 'b' y 'c'; en este caso cuando digo cualquier caracter,
no me refiero solo a letras.
[a-z] Representa el rango comprendido
de la 'a' hasta la 'z', ojo no incluye 'ñ', vocales con tildes, ni
consonantes con diéresis, en pocas palabras solo se aceptan el alfabeto
ingles.
[a-zñ] Representa el rango comprendido
de la 'a' hasta la 'z', esta vez si incluye 'ñ', ojo solo incluye a la
'ñ', si queremos incluir más caracteres los colocamos al lado de la 'ñ'.
[A-Z] Representa el rango comprendido
de la 'A' hasta la 'Z', ojo no incluye 'ñ', solo el alfabeto ingles.
[a-zA-Z] Representa el rango comprendido
de la 'a' hasta la 'z' ó 'A' hasta la 'Z',pero solo el alfabeto ingles.
[a-d[m-p]] Es equivalente a [a-dm-p],
nótese que es parecido a la expresión anterior, representa el rango
comprendido de la 'a' hasta la 'b' y 'm' hasta la 'p', es decir solo
quedan incluidas 'a','b','c','d' y 'm','n','o','p'.
[a-z&&[def]] Es equivalente a [def], es la
intersección del conjunto de la 'a' hasta la 'z' y el conjunto
'd','e','f', el resultado es el mismo conjunto 'd','e','f'; aunque se
ve innecesario esta expresión  nos ayudara a comprender la que
sigue.
[a-z&&[^def]] Representa la intersección del
conjunto de la 'a' hasta la 'z' y el conjunto todo el abecedario
excepto los caracteres 'd','e','f', el resultado es el conjunto del
abecedario excluyendo 'd','e','f'.
[a-z&&[^m-p]] Representa la intersección del
conjunto de la 'a' hasta la 'z' y el conjunto todo el abecedario
excepto los caracteres 'm','n','o','p'.

Nota: Todas la expresiones descritas anteriormente solo representan un carácter.
Ahora veamos dos caracteres más que nos ayudaran a representar expresiones más largas, '*' y el '+'; el primero representa "cero o más" mientras el segundo "uno o más"; hagamos algunos ejemplos usando java para que sea mas fácil de entender.
Usaremos el siguiente código para evaluar nuestros ejercicios, y en la practica veremos lo útil que será usar expresiones regulares.




import java.util.regex.Pattern;

public class Ejemplo {
 
    public static void main(String[] args) {
        String expresionRegular = "[abc]";
        String cadenaAEvaluar = "a";
        boolean b = Pattern.matches(expresionRegular,cadenaAEvaluar);
        if(b){
            System.out.println("La expresion SI representa la cadena a evaluar");
        }else{
            System.out.println("La expresion NO representa la cadena a evaluar");
        }      
    }
}

Donde las variables expresionRegular y cadenaAEvaluar la modificaremos según el ejercicio.

Cuando:
expresionRegular = "[abc]";
cadenaAEvaluar = "a";
El resultado sera "La expresión SI representa la cadena a evaluar"
Sin embargo usamos otras letra distintas a 'a' ó 'b' ó 'c', ó mas de un carácter en cadenaAEvaluar, nos arrogara el resultado "La expresión NO representa la cadena a evaluar".


Cuando:
expresionRegular = "[0-1]";
cadenaAEvaluar = "a";
El resultado sera "La expresión NO representa la cadena a evaluar"
Para que la cadenaAEvaluar sea correcta, debemos introducir un numero, ejemplo "2"

Como ejercicio propongo que observemos los resultados con las demás expresiones.

Continuemos, ahora cabe la pregunta, ¿y si quiero evaluar mas de un carácter?
Recordemos el método isNumero propuesto al inicio, que nos dice si una cadena es un numero, usando expresiones regulares expresionRegular seria igual a "[0-9]+" que expresa una cadena 1 ó mas caracteres compuestos por números, el método quedaría más corto:

public boolean esNumero(String cadena){
        return Pattern.matches("[0-9]+",cadena);
}

Otro ejemplo, digamos que deseamos saber si una cadena esta compuesta por un numero y una palabra en minúsculas, separada con un punto, ejemplo "12345.holamundo"

Para los números de uno o más cifras ya sabemos que es "[0-9]+", para las letras minúsculas es muy similar "[a-z]+", la expresión resultante quedara de la siguiente forma "[0-9]+.[a-z]+"


 Es decir, cuando:
 expresionRegular = "[0-9]+.[a-z]+"
 cadenaAEvaluar = "12345.holamundo";
 El resultado sera "La expresión SI representa la cadena a evaluar"

Ya puedes ver todo lo que puedes hacer?, puedes construir tu expresiones regulares para validar Email, números de celular del tipo "310-234-5678", direcciones web, etc

Aquí termino ésta primera parte, espero sus comentario para mejorar.

Y como siempre esperando serles de utilidad.



Entrada destacada

Matriz de adyacencia para un grafo

"La matriz de adyacencia es una matriz cuadrada que se utiliza como una forma de representar relaciones binarias."; aunque pa...