[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
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 :)
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:
- [Java] (regex?) extraire une sous chaîne
- Waptrick java football - Télécharger - Jeux vidéo
- Extraire une video youtube - Guide
- Jeux java itel football - Télécharger - Jeux vidéo
- Extraire le son d'une vidéo - Guide
- Chaine tnt gratuite sur mobile - Guide
8 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
1 avril 2009 à 19:38
1 avril 2009 à 19:38
Salut,
Je te donne la version avec regexp qui pourra te servir à un moment ou un autre :
Cdlt
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
Utilisateur anonyme
31 mars 2009 à 18:04
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
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
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
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
Messages postés
1274
Date d'inscription
samedi 30 août 2008
Statut
Membre
Dernière intervention
21 juin 2015
861
29 mars 2009 à 15:56
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
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
bizu53
Messages postés
1274
Date d'inscription
samedi 30 août 2008
Statut
Membre
Dernière intervention
21 juin 2015
861
1 avril 2009 à 19:01
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 :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
28 janv. 2010 à 11:04
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.
Ce qui n'enlève rien à l'utilité de la reponse de calimero6201.
Cordialement,
Dan
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
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:
Ce code m'affiche ceci :
alors que je voudrai qu'il m'affiche cela :
Je sais qu'il y a un soucis avec ma Regex, mais je n'arrive pas à la rendre "récursive".
merci d'avance
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
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
26 juil. 2011 à 16:09
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()); } }
bizu53
Messages postés
1274
Date d'inscription
samedi 30 août 2008
Statut
Membre
Dernière intervention
21 juin 2015
861
Modifié par bizu53 le 9/10/2011 à 13:17
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é).
Le coup du \1 dans l'expression régulière pour reprendre le groupe 1 (qui vaut "name" dans mon exemple).
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).
13 nov. 2009 à 10:26
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 ??
13 nov. 2009 à 12:12
Cordialement,
Dan
27 janv. 2010 à 15:49
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