IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[REGEXP] Reconnaitre un catch réalisant un throw


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Par défaut [REGEXP] Reconnaitre un catch réalisant un throw
    Bonjour,

    Je souhaite identifier via une REGEXP java le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    catch (Exception e) {
       // ...
       throw e;
    }
    Je crois que cela revient à avoir un catch suivi d'un throw avant qu'une accolade fermante ne soit trouvée.

    D'ou la regexp : "catch[.&&[^}]]*throw" qui signifie le mot "catch", puis n'importe quel caractère sauf "}" 0 ou n fois puis throw.

    Mais ça ne marche pas.

    Avez-vous une idée ?

  2. #2
    crv
    crv est déconnecté
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 16
    Par défaut
    tu peux essayer ca :
    qui signifie "catch" suivis de n'importe quel caractère different de "}" suivis de "throw".
    Ca marche pas mieux ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Par défaut
    Citation Envoyé par crv
    tu peux essayer ca :
    qui signifie "catch" suivis de n'importe quel caractère different de "}" suivis de "throw".
    Ca marche pas mieux ?
    Impeccable effectivement, mais il faut rajouter un .* à la fin si la chaine contient des caractères après le throw :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.println(Pattern.matches("catch[^}]*throw.*", "catch (Exception e) { e.printStackTrace(); throw e; }"));
     
    System.out.println(Pattern.matches("catch[^}]*throw.*", "catch (Exception e) { e.printStackTrace(); } throw e; "));
    Il ne me reste plus qu'à reconnaitre l'inverse, à savoir un catch qui ne contient pas de throw.

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Une petite remarque, n'oublie pas d'échaper le caractère '}' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "catch[^\\}]*throw.*"
    Citation Envoyé par otsgd
    Il ne me reste plus qu'à reconnaitre l'inverse, à savoir un catch qui ne contient pas de throw.
    Il te suffit de modifier ta première expression régulière afin de rendre le "throw" optionnel (avec le quantifieur ?), ainsi tu as une seule expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "catch[^\\}]*(throw)?.*"
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Par défaut
    Citation Envoyé par le y@m's
    Une petite remarque, n'oublie pas d'échaper le caractère '}' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "catch[^\\}]*throw.*"
    Le caractère '}' n'a pas besoin d'être échappé il me semble. En plus "\\" représente l'échappement du '\' => Autant pour moi, ca à l'air de marcher dans les deux cas, avec ou sans ton échappement.

    Il te suffit de modifier ta première expression régulière afin de rendre le "throw" optionnel (avec le quantifieur ?), ainsi tu as une seule expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "catch[^\\}]*(throw)?.*"
    Effectivement, mais je veux reconnaitre les expressions ou le throw ne se trouve pas et uniquement celles-ci. Ce n'est donc pas facultatif.

    D'après ce que je lis ici et là, ce n'est pas possible via une regexp, il faut faire du code, ce qui n'est pas possible dans mon cas. La négation '^' ne peut s'utiliser que sur les caractères : "[^abc]" signifie ni a ni b ni c. Mais ca ne marche pas pour un groupe de lettres.

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par otsgd
    Le caractère '}' n'a pas besoin d'être échappé il me semble.
    Si tu regarde la javadoc de la classe Pattern tu remarqueras que plusieurs expressions utilisent les accolades ('{' et '}') comme caractères spéciaux, il vaut donc mieux prendre la précaution de les échapper.

    Citation Envoyé par otsgd
    En plus "\\" représente l'échappement du '\
    cf Pourquoi dois-je doubler/quadrupler le caractère anti-slash ('\') ?
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

Discussions similaires

  1. finally et throw dans le catch ?
    Par jph_void dans le forum C#
    Réponses: 7
    Dernier message: 25/03/2010, 17h13
  2. try catch throw
    Par carnifex dans le forum C++
    Réponses: 2
    Dernier message: 16/01/2009, 18h07
  3. reconnaitre une regexp
    Par cdm1024 dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 10/11/2007, 12h59
  4. [Regexp] Problème de réalisation avec les || (OU)
    Par omlip dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 16/10/2006, 10h35
  5. Pb : Exception / déroutements / try, throw, catch
    Par Bapt_from_Reims dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2005, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo