sexta-feira, 7 de dezembro de 2012

Como fazer para utilizar o operador OR em uma expressão RegEx

As expressões regex são muito potentes e permitem realizar diversas operações. Uma das que podemos realizar é o operador lógico OR.


Vamos ver um exemplo.

Como vimos o processo consiste basicamente de 3 passos:
  • definimos o padrão
  • criamos o matcher
  • realizamos um loop com find().
  

A saída deste programa é:


Imagine que temos um texto e queremos localizar nele os possíveis telefones telefones. Vamos considerar que um telefone pode ter o formato 9999-9999 ou 999-9999.

Note como escrevi o padrão. Nele coloquei os dois padrões em uma expressão unida por um OU, assim se achar um dos dois, o resultado será representado. Vamos ver como ficou:

Funcionou.

Você que está lendo e conhece um pouco de expressões regulares já vai falar... mas esta não é a melhor forma de fazer. Ok! Concordo. Podemos facilmente alterar a expressão do código acima para

String regex = "\\d?\\d\\d\\d-\\d\\d\\d\\d";

O padrão \d? indica ao processador regex que ele deve procurar a ocorrência de um número ou nenhum, gerando o mesmo resultado da expressão grande apresentada no código fonte. Mas vale o exemplo didático, não é?

Dê uma olhada no resumo das expressões regulares em http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html

quarta-feira, 5 de dezembro de 2012

Executando um GET em Java

Você já deve ter precisado de acessar uma página web em Java, não é?

O processo é relativamente fácil realizar esta tarefa. Vamos mostrar neste post como fazer o acesso a uma página utilizado uma requisição com o método GET do protocolo HTTP.

Para fazermos este exemplo funcionar, vamos precisar das bibliotecas HttpComponents do projeto Apache. Na instalação do Netbeans elas já estão presentes

Para conseguirmos realizar a leitura temos que
  • criar uma instância da classe DefaultHttpClient que fará a conexão com o site
  • criar uma instância da requisição que no nosso caso será representada por HttpGet. O construtor desta classe recebe a URL como parâmetro
  • solicitamos uma resposta do servidor, capturando o retorno de HttpClient.execute() que retorna uma classe HttpResponse
  • Passamos esta resposta para HttpEntity que nos permite ler o conteúdo da resposta enviada pelo servidor web. Este conteúdo é obtido pela chamada a HttpEntity.getContent()
  • HttpEntity.getContent() retorna um InputStream que é lido.

No nosso exemplo passamos InputStream para um buffer e depois lemos o conteúdo linha a linha.



Vamos ver a saída?

Como estamos mandando para a saída padrão, o resultado é o código fonte da página solicitada.
 
Observação: para que este exemplo funcione você precisa dos pacotes httpcore, httpclient e common-logging do projeto HttpComponents da Apache. Eles podem ser baixados em http://hc.apache.org/downloads.cgi.

terça-feira, 4 de dezembro de 2012

Como converter Enum em String e vice versa

Se você é um programador Delphi, você vai adorar isto e detestar o Delphi. Em Java conseguimos fazer a conversão de String para Enum e de Enum para String.

Enum é um tipo cujos campos consistem em um conjunto fixo de constantes. Com são constantes, para seguirmos a padronização, os valores são escritos em maiúsculas. Um exemplo comum de um tipo enumerado são os pontos cardeais, cores, dias da semana.

Para definir um tipo enumerado, usamos a palavra chave enum, como no exemplo abaixo:

public enum DiasDaSemana {
     DOMINGO, SEGUNDA, TERÇA, QUARTA, QUINTA, SEXTA, SABADO
}

Por que nossos exemplos irão funcionar? Quando temos uma declaração enum como a acima, na verdade estamos extendendo a classe java.lang.Enum. A classe Enum pode incluir métodos e outros atributos. O compilador automaticamente adiciona alguns métodos quando cria um enum.

De String para Enum

As classes Enum possuem por default um método valueOf(String value) que pega o parâmetro e converte em um enum. Vamos testar uma enumeração normal:

public class EnumTest1 {
 
  private enum PTCARDEAL { NORTE, SUL, LESTE, OESTE }

  public static void main(String[] args) {
    //Mostra a conversão
    PTCARDEAL norte = PTCARDEAL.valueOf("NORTE");
    System.out.println(norte);
    PTCARDEAL sul = PTCARDEAL.valueOf("SUL");
    System.out.println(sul);
    PTCARDEAL leste = PTCARDEAL.valueOf("LESTE");
    System.out.println(leste);
  }
}

A saída para este programa já e muito mais bacana do que conseguiríamos no Delphi:

Podemos alterar os valores retornados como string sobrepondo as definições toString() para cada valor da enumeração. Vejamos o nosso exemplo original alterado:

public class EnumTest2 {
  private enum PTCARDEAL {

  /*
   * texto do poema "Sou quatro pontos cardeais"
   * http://poesiaoriginalissima.blogspot.com.br/2010/01/sou-quatro-pontos-cardeais.html
   */
  NORTE {
    @Override
    public String toString() {
      return "Norte é vida verde na terra…meu consciente";
    }
  },
  SUL {
    @Override
    public String toString() {
      return "Sul é água volta e revolta…num vario extenso";
    }
  },
  LESTE {
    @Override
    public String toString() {
      return "Este é cada aurora incluída neste dia\n"+
             "Acordo e penso: num sobressalto";
    }
  },
  OESTE {
    @Override
    public String toString() {
      return "Oeste…a certeza do presente";
    }
  }
}

public static void main(String[] args) {
    
  //Mostra a conversão
  PTCARDEAL norte = PTCARDEAL.valueOf("NORTE");
  System.out.println(norte);
  PTCARDEAL sul = PTCARDEAL.valueOf("SUL");
  System.out.println(sul);
  PTCARDEAL leste = PTCARDEAL.valueOf("LESTE");
  System.out.println(leste);
    
}
}

A saída deste programa é:

Vamos utilizar a mesma classe de EnumTest2 alterando
somente o método main().

Conseguimos com isto retornar os mesmos valores que em EnumTest1

public static void main(String[] args) {
    
        // Exemplo
        String norte = PTCARDEAL.NORTE.name();
        System.out.println(norte);
        String sul = PTCARDEAL.SUL.name();
        System.out.println(sul);
        String leste = PTCARDEAL.LESTE.name();
        System.out.println(leste);
}



Para o exemplo usamos Enum.name() que retorna o nome da constante enumerada exatamente como foi declarada.