Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question Expression reguliere

    30 janvier 2010 à 19:39:45

    Bonjour tous
    je comprend pas pourquoi ma classe ne detecte pas la premiere occurence le temps que ca marche bien pour la deuxieme chaine et j'ai mis Pattern.Multiligne mais rien
    voici le code :
    package test;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class Main {
        public static void main(String[] args) {
     String motif = "<!-- message -->(.*)<!-- / message -->";
          String chaine = "<!-- message -->123\n4<!-- / message --><!-- message -->545644<!-- / message -->";
          Pattern p = Pattern.compile(motif,Pattern.MULTILINE);
          Matcher m = p.matcher(chaine);
          while(m.find()) {
              //System.out.println("Position: " + m.start() + "-" + m.end());
    System.out.println(m.group(1));
          }    
        }
    }
    

    voici ce qu'elle m'affiche :
    545644

    Merci de me répondre
    • Partager sur Facebook
    • Partager sur Twitter
      31 janvier 2010 à 4:42:00

      Oui me semble avoir déjà eu ce genre de trucs.
      T'as essayé group(0) ? et group(2) ?
      Je vais aller voir à quoi correspond le flag MULTILINE.
      • Partager sur Facebook
      • Partager sur Twitter
        31 janvier 2010 à 14:52:18

        voici la solution c'etait le motif erroné
        Pattern p = Pattern.compile("<!-- message -->([\\s\\w]*)<!-- / message -->", Pattern.MULTILINE);
        
        • Partager sur Facebook
        • Partager sur Twitter
          31 janvier 2010 à 15:02:22

          Il ne me semble pas nécessaire de modifier le motif. Enfin si ça marche tant mieux.
          • Partager sur Facebook
          • Partager sur Twitter
            5 février 2010 à 23:28:18

            Le problème vient que tu ne connais pas les regex. Premièrement le symbole . signifie n'importe quel caractère "normal" il ne prend pas les \n par défaut. L'opérateur * est gourment et va capturer le plus possible. Il faut donc que tu mettes
            (.*?) et pas (.*) dans ton regex, sinon ca va capturer bien plus que ce que tu veux. 5 sec de lecture de l'api montre que le flag MULTILINE concerne uniquement le comportement de ^ et $, tu voulais surement activé le flag DOTALL
            • Partager sur Facebook
            • Partager sur Twitter
              8 février 2010 à 8:31:44

              à ce propose, je n'ai jamais trouvé comme désigner un saut de ligne \n avec les regex

              j'utilise [\d\D] pour me tirer d'affaire mais c'est pas propre
              remarque que j'imagine qu'il faut les retirer tout simplement :p

              Anarion a raison, c'est un comportement normal, ta regex en prends le plus possible si tu ne mets pas ?
              • Partager sur Facebook
              • Partager sur Twitter
                8 février 2010 à 13:12:50

                Bin \n tout simplement, tu as aussi \s qui prend tout les blancs (avec java il faut backslasher les \ donc ca donne \\n et \\s)
                • Partager sur Facebook
                • Partager sur Twitter
                  8 février 2010 à 13:37:20

                  le délimiteur de changement de ligne indépendant de la plateforme c'est \R si mes souvenirs sont bons
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Question Expression reguliere

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown