Prenons le cas où l'on chercher à retrouver un texte entre 2 balises.
Attention, ce code n'est pas censé remplacé un parseur XML, il ne supporte pas en particulier le fait qu'un élément contienne un élément ayant le même nom.
J'ai souvent vu réaliser ce type d'analyse avec un code du type
String str = "<name>toto</name>";
Pattern p = Pattern.compile("<.*>(.*)<.*>");
Matcher m = p.matcher( str );
while( m.find() ) {
System.out.println( "1 = " + m.group( 1 ) );
}
On notera que la chaîne: "<name>toto</error>" produira exactement le même résultat. Alors qu'à priori, il y a une erreur de syntaxe.Par contre la chaîne "<name>toto<something/></name>" produira une chaîne vide. Alors que la chaîne est valide.
Je vous propose donc d'utiliser plutôt une expression régulière du type un peu plus élaborée qui permet de résoudre ces deux points.
final String str = "<name>toto<something/></name>";
final Pattern pattern = Pattern.compile("<(.+)>(.*)</\\1>");
final Matcher matcher = pattern.matcher( str );
while( matcher.find() ) {
final String elementName = matcher.group(1);
final String elementContent = matcher.group(2);
System.out.println( "elementName = " + elementName );
System.out.println( "elementContent = " + elementContent );
}
Vous noterez l'écriture avec un \1 dans l'expression régulière qui permet de reprendre le groupe 1 pour définir la fin du matcher.
Aucun commentaire:
Enregistrer un commentaire