1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problema com exp. regular para pegar bloco try/catch

Bom dia pessoal,

Estou tentando criar uma expressão regular para validar um programa de geração de código, no momento estou tentando criar uma expressão regular para capturar os blocos try/catch (com o método "contains" da classe String já vejo quais excessões se encontram no código) e estou tentando verificar se os mesmos estão abrindo e fechando corretamente. O meu problema é que não entendo muito de expressões regulares, principalmente em java. Até o momento já cheguei na seguinte expressão:

try\\{((.)+)\\}catch

Já até testei esta expressão no site Regex Tester com o seguinte trecho de código:

public boolean add(Animal animal){
        //1logger:1:O método add foi iniciado EntityTransaction trans = DAOFactory.getInstance().getEm().getTransaction();

        try{


                //1logger:1:A conexão foi aberta no método add
            trans.begin();

        DAOFactory.getInstance().getEm().persist(animal);
                    if(res){
                trans.commit();
                //1logger:1:A operação foi realizada com sucesso!!!                return true;            }else{
                trans.rollback();
                //1logger:1:A operação não foi realizada!!!                return false;            }
        }catch(java.sql.BatchUpdateException e){
            \1logger:1:Houve um problema durante a operação:2:e.getStackTrace()
            trans.rollback();        
            return false;
        }catch(Exception e){
            \1logger:1:Houve um problema durante a operação:2:e.getStackTrace()
            trans.rollback();
            return false;
        }finally{
            em.close();
            //1logger:1:A conexão foi encerrada        }

        return false;

        return true;
    }

No Regex Tester a expressão consegui capturar perfeitamente o trecho que contém o try/catch, porém no Java ou o programa se perde ou não encontra. Está aqui o código que estou utilizado para realizar o teste:

package com.jubernate.geradorcodigo.factory.persistence;

import static org.junit.Assert.assertTrue;

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

import org.junit.Test;
import org.junit.experimental.categories.Category;

import com.jubernate.geradorcodigo.test.Fast;

@Category(Fast.class)
public class TestaExpReg {


    //Este aqui não passa
    @Test
    public void testaExpRegTryCatch(){
        String texto = "public boolean add(Animal animal){\n"+ 
                "        //1logger:1:O método add foi iniciado EntityTransaction trans = DAOFactory.getInstance().getEm().getTransaction();\n"+ 
                "        \n"+ 
                "        try{\n"+ 
                "            \n"+ 
                "            \n"+ 
                "                //1logger:1:A conexão foi aberta no método add\n"+ 
                "            trans.begin();\n"+ 
                "\n"+ 
                "        DAOFactory.getInstance().getEm().persist(animal);\n"+ 
                "                    if(res){\n"+ 
                "                trans.commit();\n"+ 
                "                //1logger:1:A operação foi realizada com sucesso!!!                return true;            }else{\n"+ 
                "                trans.rollback();\n"+ 
                "                //1logger:1:A operação não foi realizada!!!                return false;            }\n"+ 
                "        }catch(java.sql.BatchUpdateException e){\n"+ 
                "            \1logger:1:Houve um problema durante a operação:2:e.getStackTrace()\n"+ 
                "            trans.rollback();        \n"+ 
                "            return false;\n"+ 
                "        }catch(Exception e){\n"+ 
                "            \1logger:1:Houve um problema durante a operação:2:e.getStackTrace()\n"+ 
                "            trans.rollback();\n"+ 
                "            return false;\n"+ 
                "        }finally{\n"+ 
                "            em.close();\n"+ 
                "            //1logger:1:A conexão foi encerrada        }\n"+ 
                "        \n"+ 
                "        return false;\n"+ 
                "\n"+ 
                "        return true;\n"+ 
                "    }\n";

        Pattern padrao = Pattern.compile("try\\{((.)+)\\}catch", Pattern.DOTALL | Pattern.MULTILINE);
        Matcher pesquisa = padrao.matcher(texto);        
        assertTrue(pesquisa.matches());
    }


    //Neste trecho o Java se perde (porém neste caso se o catch - lá do final - estiver correto, daí passa)
    @Test
    public void testaExpRegReduzido(){
        Pattern padrao = Pattern.compile("try\\{((.|\\s)+)\\}catch", Pattern.DOTALL);
        Matcher pesquisa = padrao.matcher("try{//1logger:1:A conexão foi aberta no método add trans.begin();\nDAOFactory.getInstance().getEm().persist(animal);if(res){trans.commit();//1logger:1:A operação foi realizada com sucesso!!!return true;}else{trans.rollback();            //1logger:1:A operação não foi realizada!!!                return false;            }        }cadsfatch");
        assertTrue(pesquisa.matches());
    }
}

Agradeço a todos que possam me dar uma esclarecida sobre onde eu estou errando ou que possa me explicar como que eu faço para fazer o Java reconhecer a expressão.

Inté...

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java testes ou faça a sua própria pergunta.