Les Allergies
Alimentaires
Posez votre question Signaler

[Java] (regex?) extraire une sous chaîne [Résolu]

bizu53 1199Messages postés 30 août 2008Date d'inscription 26 mai 2012Dernière intervention - Dernière réponse le 29 mars 2012 à 14:37
Bonjour,
Je voudrais extraire une sous-chaîne se situant entre 2 balises.
J'ai un String comme : "<name>toto</name>" et je voudrais en extraire "toto".
Je suis sûr que c'est bidon mais c'est pas mon truc les expressions régulières en Java.
Merci d'avance à celui (ou celle) qui saura me dire comment faire ça :)
Lire la suite 

[Java] (regex?) extraire une sous chaîne »

15 réponses
Réponse
+9
moins plus
Salut,
Je te donne la version avec regexp qui pourra te servir à un moment ou un autre :
import java.util.regex.*;

String aParser="<name>toto</name>";
Pattern p=Pattern.compile("<.*>(.*)<.*>");
Matcher m=p.matcher(aParser);
while(m.find()) 
   System.out.println(m.group(1));

Cdlt
serialover - 13 nov. 2009 à 10:26
Bonjour,

question pour les génies de regexp, comme peut on extraire toutes les chaines entre #{chaine}# dans ce text :


blabla #{chaine1}# blablablablablablablablablablablabla #{chaine2}# blablablabla #{chaine3}# blablablablablablablabla


en utilisant regexp comment retourner une vecteur de string contenant chaine1, chaine2, chaine3 ??
danimo- 13 nov. 2009 à 12:12
Salut,

	
         String chaine = "blabla #{chaine1}# blablablablablablablablablablablabla #{chaine2}# blablablabla"
            + " #{chaine3}# blablablablablablablabla ";
         chaine = chaine.replaceAll(" ", ""); // car nous ne voulons pas les blancs
      	
         String motif = "#\\{chaine.\\}#";  // le . de chaine. signifie qu'on veut chaine suivie d'un caractère (dans notre cas chaine1 2 ou 3)
      	
         int nbreDeFois = 0;
         
         System.out.println("\nRECHERCHE DU MOTIF \""  + motif + "\""  + " dans la cha\u00eene:\n"
            + "\"" + chaine + "\"\n");
      		
         Pattern pattern = Pattern.compile(motif);
         Matcher matcher = pattern.matcher(chaine);
      	
         while(matcher.find())
         {
            nbreDeFois++;
            System.out.println("nbreDeFois: " + nbreDeFois);
         }
            
         System.out.println("\n\"" + motif + "\"" + " existe " + nbreDeFois
            + " fois dans \"" + chaine + "\"\n");


Cordialement,

Dan
calimero6201serialover - 27 janv. 2010 à 15:49
Voici avec une regexp pour récupérer ce que tu demandes ;o) (n'importe quelles chaines de caractères ,même autre que 'chaineX',je pense que c'est ce que tu veux)


Pattern pattern = Pattern.compile("(.*?)*#\\{(.*?)\\}#.*?");
String chaine = "blabla#{chaine1}# blablablablablablablablablablablabla #{chaine2}# blablablabla"
+ " #{chaine3}# blablablabla{ksdfgifugqfhezf}blabla#{nonChaine}#blabla ";
Matcher m = pattern.matcher(chaine);
while(m.find()){
System.out.println(m.group(2));
}


--->Resultat

chaine1
chaine2
chaine3
nonChaine
Ajouter un commentaire
Réponse
+1
moins plus
Salut,

chaine1="<name>toto</name>";

Puisqu'on a toujours <name> et </name>";
C'est possible avec indexOf (pour le début) et lastIndexOF (pour la fin):

int index1 = chaine1.indexOf(">"); nous donne l'emplacement du premier ">" et
int index2 = chaine1.lastIndexOf("<"); nous donne l'emplacement du dernier "<"


String x = chaine1.substring(chaine1.indexOf">")+1, chaine1.lastIndexOf("<"));
System.out.println("x = " + x);

Une exception StringIndexOutOfBoundsException
sera levée si les balises sont incorrectes.

Cordialement,

Dan
Ajouter un commentaire
Réponse
+0
moins plus
salut,
par exemple si vous avez la chaine : chaine1="<name>toto</name>";
vous pouvez extraire la sous-chaine "toto" par la fonction subString(indice début,indice fin)
donc vous faites comme ça:
String sous-chaine=subString(6,10);

nb :6 est l'indice début de sous chaine "toto" dans la chaine1
10 est l'indice fin de sous chaine "toto" dans la chaine1
bizu53- 29 mars 2009 à 15:56
C'est comme ça que j'ai fait en attendant une réponse.
Mais toto varie à chaque fois, alors ça me fait compter mettre la longueur de <name>, et retirer la longueur de </name> à la longueur de la String... c'est pas très joli joli. Ce n'est pas faisable avec une regex ?

Je crois que je vais m'en contenter alors merci quand même
Ajouter un commentaire
Réponse
+0
moins plus
Ah oui, je n'y avais pas pensé. Merci, je vais mettre mon sujet comme résolu parce que ça me va :)
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

Je n'avais pas vu que tu demandais comment mettre le résultat dans un vecteur.
Je n'utilise pas les vecteurs (il est souvent recommandé de ne plus les utiliser).

Je préfère utiliser SPLIT, donc stocker dans un tableau.

À toutes fins utiles je montre ici comment faire.

// imports: 
      //import java.util.regex.Pattern;
      //import java.util.regex.Matcher;
            
         String chaine = "blabla #{chaine1}# blablablablablablablablablablablabla #{chaine2}# blablablabla"
            + " #{chaine3}# blablablablablablablabla ";
    
// SPLIT
         // compilation de la regex
         Pattern pat = Pattern.compile("\\W"); // le séparateur est un non mot (motif \W)
         // éclatement en sous-chaînes dans le tableau sousChaines[]
         String[] sousChaines = pat.split(chaine);

         // affichage du tableau des sous-chaînes
         System.out.println("\nNombre de sous-chaines: " + sousChaines.length
            + "\ndont:\n");
            
         for(int i = 0; i < sousChaines.length; i++)
         {
            if (sousChaines[i].startsWith("chaine"))// uniquement chainex (x = 1, 2 ou 3)
            {
               System.out.println(sousChaines[i]);
// éventuellement stocker dans un vecteur ici
            }
         }


Ce qui n'enlève rien à l'utilité de la reponse de calimero6201.

Cordialement,

Dan
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

j'ai essayé de me débrouiller avec les exemples déjà donné dans cette page mais je n'arrive pas à trouver une solution.

Voici mon code:
// Text
String text = "blabla <br> blabla <br> blabla <br> blabla <br> blabla";

// Définition des Regex
String breakLine = "(.*)<br>(.*)<br>(.*)";

// Utilisation des Regex
Matcher mBreakLine = Pattern.compile(breakLine).matcher(text);

// Vérification des occurrences
while(mBreakLine.find())
{
     // Affichage de group(1), group(2), ... , group(n)
     for(int n=1; n<=mBreakLine.groupCount(); n++)
     {
          System.out.println(mBreakLine.group(n));
     }
}

Ce code m'affiche ceci :
blabla<br>blabla<br>blabla<br> // group(1)
blabla // group(2)
blabla // group(3)

alors que je voudrai qu'il m'affiche cela :
blabla // group(1)
blabla // group(2)
blabla // group(3)
...    // group(n)


Je sais qu'il y a un soucis avec ma Regex, mais je n'arrive pas à la rendre "récursive".
merci d'avance
KX- 26 juil. 2011 à 16:09
Ceci fonctionne comme tu veux...

import java.util.Scanner;

public class Test
{
    public static void main(String...args)
    {
        String source = "blabla <br> blabla <br> blabla <br> blabla <br> blabla";
        String pattern = "[\\s]*<br>[\\s]*";
        
        Scanner sc = new Scanner(source).useDelimiter(pattern);
        
        while (sc.hasNext())
            System.out.println(sc.next());
    }
}
patewing - 26 juil. 2011 à 16:28
Merci bien pour cet exemple,

cordialement
spinaks - 29 août 2011 à 16:33
C'est peut être trop tard mais j'ai l'impression que tu veux parser du XML et donc XPATH fera l'affaire
Ajouter un commentaire
Réponse
+0
moins plus
Je m'auto-réponds en déterrant un peu parce que j'ai trouvé récemment ce que je cherchais très exactement (même si je m'en étais sorti avec ce qui avait été proposé).

final String s = "<name>toto<emmerdeur/></name>";  
final Pattern pattern = Pattern.compile("<(.+)>(.*)</\\1>");  
final Matcher matcher = pattern.matcher(s);  
while(matcher.find()) {  
 final String group = matcher.group(2);  
 System.out.println(group);  
}


Le coup du \1 dans l'expression régulière pour reprendre le groupe 1 (qui vaut "name" dans mon exemple).
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

SVP si par exemple j'ai l'expression suivante
String aParser="<Names><name>toto</name></Names>";
et je veut retourner sauf cette expression : < name>toto</name>
Aidez moi plzzzzzzzz
Merci d'avance .
Ajouter un commentaire
Ce document intitulé « [Java] (regex?) extraire une sous chaîne » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?