Expressão Regular - Parte 02
Autor: Edivando Alves | Publicado: 2012-11-15T06:50:00-08:00

Continuando a aula anterior sobre&nbsp;expressões&nbsp;regulares, vamos ver agora os agrupadores. Estes como o nome já diz, agrupa, verifica a existência de um determinado caracter em um determinado grupo.

Agrupadores: Agrupam conjuntos de caracteres.

[...] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Agrupamento

[a-z] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Alcance

[a-e][i-u] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; União

[a-z&amp;&amp;[aeiou]] &nbsp; Interseção

[^abc] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Exceção

[a-z&amp;&amp;[^m-p]] &nbsp; Subtração

\x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Fuga literal

 System.out.println( "a".matches("[a-z]") );  
 System.out.println( "A".matches("[A-Z]") );  
 System.out.println( "0".matches("[0-9]") );  

&nbsp; &nbsp;A primeira linha, verifica a existência de um carácter de a - z, ou seja qualquer letra do alfabeto minúscula será considerada. A segunda linha também verifica a ocorrência de um caracter, porém deve ser maiúsculo.
A próxima linha verifica se existe um número de 0 a 9.

Outro exemplo, quero que retorne positivo a palavra "sim", caso inicie com minúsculo, ou maiúsculo. Posso usar o seguinte agrupador "[sS]" e o resto da palavra de deve ser&nbsp;obrigatoriamente&nbsp;minúscula. Os exemplos abaixo retornam true.
 System.out.println( "sim".matches("[sS]im") );  
 System.out.println( "Sim".matches("[sS]im") );  


Quero verificar se o valor e Sim,sim ou Yes, yes. Como fazer? Posso usar o metacaracter (ou "|").
 System.out.println( "Yes".matches("[sS]im|[yY]es") );  



Verificar se um nome começa com letra maiúscula, não importando o resto da palavra, que pode ser maiúscula e minúscula.
 System.out.println( "Hello".matches("[A-Z][a-zA-Z]*") );  


Quero receber qualquer palavra que termina com "olho" e não comece com "a, b ou c";
 System.out.println( "olho".matches("[^abc]lho") );  

Esse exemplo acima retorna "true", já o próximo retorna falso. Pois a palavra "alho" começa com "a".
 System.out.println( "alho".matches("[^abc]lho") );  


Validar um&nbsp;Email.

 System.out.println( "edivando@edivando.com".matches("\\w+@\\w+\\.\\w{2,3}") );  

O primeiro metacaracter "\\w+", procura por 1 ou mais caracteres, seguido pelo "@", por mais uma sequencia de caracteres, seguido por ponto "\\." seguido por 2 ou 3 caracteres.


Neste exemplo quero pegar todas as palavras da String doce, que possuem a palavra "doce", não importando se esta maiúscula ou minúscula. A classe Pattern prepara a expressão regular antes de execultar o método matcher.
 public class Regex{  
      public static void main(String[] args){  
           String doce = "Qual é o Doce mais doCe que o doce?";  
           Matcher matcher = Pattern.compile("(?i)doce").matcher(doce);  
           while (matcher.find()) {  
                System.out.println(matcher.group());  
           }  
      }  
 }  

Substituições

&nbsp; &nbsp; &nbsp;É muito útil utilizar regex junto ao&nbsp;método&nbsp;replace da classe String. Ficando muito mais simples sua utilização. Por exemplo, tenho a String: "Qual o Doce mais doCe que o doce?", e quero mudar a palavra "doce" (todas as palavras sem me importar se é maiúscula ou minúscula) por "DOCINHO".
 public class Arquivo2 {  
      public static void main(String[] args){  
           String doce = "Qual é o Doce mais doCe que o doce?";  
           String r = doce.replaceAll("(?i)doce","DOCINHO");  
           System.out.println(r);  
      }  
 }  





&nbsp; &nbsp; Tenho uma url e quero mudar sua apresentação de "www.system.com.br/clientes-2011.html"
quero agora mostrar na forma: "http://www.system.com.br/2011/clientes.jsf". Como faço isso? Pego a antiga url e divido-a em variáveis "(www.system.com.br)/(clientes)-(2011).html", usando os parenteses (), em seguida modifico o que pode variar, no caso "clientes" e "2011", ficando assim: "(www.system.com.br)/(\\w{2,})-(\\d{4}).html". Pronto temos uma expressão regular para a antiga url. Agora é só montar a nova url, ficando assim "http://$1/$3/$2.jsf". Sendo que $1 corresponde a (www.system.com.br), $2 a (clientes) e $3 a (2011).
 public class Arquivo2 {  
      public static void main(String[] args){  
           String url = "www.system.com.br/clientes-2011.html";  
           String re = "(www.system.com.br)/(\\w{2,})-(\\d{4}).html";  
           String r = url.replaceAll(re, "http://$1/$3/$2.jsf");  
           System.out.println(r);  
      }  
 }  
Retornando a url desejada.

 http://www.system.com.br/2011/clientes.jsf