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 :

Expression régulière / retour chariot


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 42
    Par défaut Expression régulière / retour chariot
    bonjour à tous, je me lance dans les expressions régulières est malgré le grand nombre de tuto dispo sur le net je m'en sors pas.

    J'ai un texte, de l'html, et je voudrais retirer les commentaires html donc tout ce qui se trouve entre <!-- et --> (tag compris).

    voici le code que j'ai ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int mLast = 0;
    StringBuffer m9482= new StringBuffer();
    //Pattern matchant les commentaires HTML
    p = Pattern.compile("(<!--.*-->)");
    m = p.matcher(monTexte);
    while (m.find()){
      //on recopie la chaine avant ou entre 2 commentaires
      m9482.append(monTexte.substring(mLast, m.start()));
      //on se positionne sur la fin du commentaire
      mLast = m.end();
    }
    //on recupere la chaine après le dernier commentaire
    m9482.append(monTexte.substring(mLast));
    Ce code marche si je met un entrant tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String monTexte = "toto <!-- plop --> et pouet <b>plip</b>";
    Cependant je peux avoir dans mes commentaires 1 ou plusieurs retour chariot tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String monTexte = "toto <!-- plop 
    une ligne et
    une autre --> et pouet <b>plip</b>";
    Et dans ce cas je n'arrive pas à ecrire mon pattern j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    p = Pattern.compile("(<!--([.|\\n]*)-->)");
    Mais ça marche pas. Si quelqu'un peut m'aider ca serait top

    Merci à tous

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = Pattern.compile("(<!--.*?-->)",Pattern.MULTILINE|Pattern.DOTALL)

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 42
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = Pattern.compile("(<!--.*?-->)",Pattern.MULTILINE|Pattern.DOTALL)


    Ca marche impécable, avant de tagger mon topic en résolu, peux tu juste donner quelques explications sur la solution?

    Merci

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    La doc de la classe Pattern est assez complète sur le sujet : Pattern

    En fait il n'y a que Pattern.DOTALL qui te servent réellement :
    • Pattern.DOTALL indique que le caractère '.' doit matcher tous les caractères, y compris les fins de ligne (ce qui n'est pas le cas normalement).
    • Pattern.MULTILINE change les notions associés aux caractères ^ et $. Par défaut ils représentent le début et la fin de la chaine à traiter. En mode 'multiligne' ils représentent le début et la fin de chaque ligne de la chaine.


    Ces options peuvent être directement inclus dans le pattern via (?s) et (?m)...


    A noter également que tu dois également utiliser la réticence en changeant ton pattern pour ceci : "<!--.*?-->"
    Le .*? diffère du .* par le fait qu'il ne prendra en compte que la plus petite chaine correspondante. Ainsi si en entrée tu as ceci : "Text 1 <!-- Comment 1 --> Text 2 <!-- Comment 2 --> Text 3".
    • Avec ton pattern actuelle (.*), il tentera de prendre le premier <!-- et le dernier -->, donc il supprimera le texte suivante : "<!-- Comment 1 --> Text 2 <!-- Comment 2 -->"
    • Avec la réticence, il s'arrêtera au premier --> et donnera le bon resultat.



    De même, tu t'embêtes à manipuler les index du buffer alors que la classe Matcher le fait déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	StringBuffer m9482 = new StringBuffer();
    	// Pattern matchant les commentaires HTML
    	Pattern p = Pattern.compile("(<!--.*-->)", Pattern.DOTALL);
    	Matcher m = p.matcher(monTexte);
    	while (m.find()) {
    		// on recopie la chaine avant
    		// En remplacant les commentaires par 'rien'
    		m.appendReplacement(m9482, "");
    	}
    	// on recupere la chaine après le dernier commentaire
    	m.appendTail(m9482);
    Voir d'utiliser directement replaceAll() s'il s'agit d'un simple remplacement comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Pattern p = Pattern.compile("(<!--.*?-->)", Pattern.DOTALL);
    	String noComment = p.matcher(monTexte).replaceAll("");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String noComment = monTexte.replaceAll("(?s)<!--.*?-->", "");
    a++

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 42
    Par défaut
    Merci beaucoup pour toutes ces explications qui m'eclairent un peu plus sur les RegExp faute d'utilisation et d'approfondissement de l'API.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2007] [Regex] Prise en compte du retour chariot dans une expression régulière
    Par MyKroPhone dans le forum VBA Word
    Réponses: 1
    Dernier message: 21/08/2014, 14h15
  2. [expression régulière]Retours à la ligne
    Par ProgVal dans le forum Général Python
    Réponses: 2
    Dernier message: 06/06/2010, 06h09
  3. expression régulière : retour à la ligne
    Par mobi38 dans le forum Eclipse
    Réponses: 1
    Dernier message: 05/10/2007, 09h34
  4. expression régulière : retour à la ligne
    Par mobi38 dans le forum Eclipse Java
    Réponses: 12
    Dernier message: 22/08/2007, 14h19
  5. [debutant] Expression régulière : retour ligne
    Par absolut75 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 12/07/2006, 16h48

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