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

Résolu/Fermé
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 - 29 mars 2009 à 14:58
 toto88 - 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 :)
A voir également:

8 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 avril 2009 à 19:38
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
14
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 ??
0
Utilisateur anonyme > serialover
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
0
calimero6201 > serialover
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
0
Utilisateur anonyme
31 mars 2009 à 18:04
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
3
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
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
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
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
1 avril 2009 à 19:01
Ah oui, je n'y avais pas pensé. Merci, je vais mettre mon sujet comme résolu parce que ça me va :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
28 janv. 2010 à 11:04
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
0
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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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());
    }
}
0
Merci bien pour cet exemple,

cordialement
0
C'est peut être trop tard mais j'ai l'impression que tu veux parser du XML et donc XPATH fera l'affaire
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
Modifié par bizu53 le 9/10/2011 à 13:17
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).
0
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 .
0