[Java] (regex?) extraire une sous chaîne
Résolu
bizu53
Messages postés
1274
Date d'inscription
Statut
Membre
Dernière intervention
-
toto88 -
toto88 -
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
- Jeux java itel - Télécharger - Jeux vidéo
- Extraire une video youtube - Guide
- Extraire le son d'une vidéo - Guide
- Eclipse java - Télécharger - Langages
8 réponses
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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()); } }
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).
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 ??
Cordialement,
Dan
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