89 votes

Java regex pour extraire le texte entre les balises

J'ai un fichier avec des balises personnalisées et j'aimerais écrire une expression régulière pour extraire la chaîne entre les balises. Par exemple si mon tag est:

 [customtag]String I want to extract[/customtag]
 

Comment pourrais-je écrire une expression régulière pour extraire uniquement la chaîne entre les balises. Ce code semble être un pas dans la bonne direction:

 Pattern p = Pattern.compile("[customtag](.+?)[/customtag]");
Matcher m = p.matcher("[customtag]String I want to extract[/customtag]");
 

Vous ne savez pas que faire ensuite. Des idées? Merci.

197voto

hoipolloi Points 3639

Vous êtes sur la bonne voie. Maintenant, il vous suffit d'extraire le groupe souhaité, comme suit:

 final Pattern pattern = Pattern.compile("<tag>(.+?)</tag>");
final Matcher matcher = pattern.matcher("<tag>String I want to extract</tag>");
matcher.find();
System.out.println(matcher.group(1)); // Prints String I want to extract
 

Si vous voulez extraire plusieurs hits, essayez ceci:

 public static void main(String[] args) {
    final String str = "<tag>apple</tag><b>hello</b><tag>orange</tag><tag>pear</tag>";
    System.out.println(Arrays.toString(getTagValues(str).toArray())); // Prints [apple, orange, pear]
}

private static final Pattern TAG_REGEX = Pattern.compile("<tag>(.+?)</tag>");

private static List<String> getTagValues(final String str) {
    final List<String> tagValues = new ArrayList<String>();
    final Matcher matcher = TAG_REGEX.matcher(str);
    while (matcher.find()) {
        tagValues.add(matcher.group(1));
    }
    return tagValues;
}
 

Cependant, je conviens que les expressions régulières ne sont pas la meilleure réponse ici. J'utiliserais XPath pour trouver les éléments qui m'intéressent. Voir l' API Java XPath pour plus d'informations.

17voto

jdc0589 Points 3385

Pour être tout à fait honnête, les expressions régulières ne sont pas la meilleure idée pour ce type d'analyse. L'expression régulière que vous avez posté, sera probablement idéal pour les cas simples, mais si les choses deviennent plus complexes, vous allez avoir de gros problèmes (pour la même raison pourquoi vous ne pouvez pas analyser de manière fiable HTML avec des expressions régulières). Je sais que vous avez probablement ne veulent pas entendre cela, je sais que je n'ai pas quand j'ai demandé le même type de questions, mais le traitement de chaîne est devenue bien plus fiable pour moi après que j'ai cessé d'essayer d'utiliser des expressions régulières pour tout.

jTopas est un super générateur de jetons qui le rend assez facile à écrire des analyseurs à la main (je vous suggère FORTEMENT de jtopas au cours de la java standard scanner/etc.. bibliothèques). Si vous voulez voir jtopas dans l'action, ici, sont quelques-uns des analyseurs j'ai écrit à l'aide de jTopas pour analyser ce type de fichier

Si vous êtes d'analyser des fichiers XML, vous devriez être en utilisant un analyseur xml de la bibliothèque. Ne le faites pas vous-même, sauf si vous êtes juste de le faire pour le fun, il y a plently de prouvé options là-bas

2voto

    final Pattern pattern = Pattern.compile("tag\\](.+?)\\[/tag");
    final Matcher matcher = pattern.matcher("[tag]String I want to extract[/tag]");
    matcher.find();
    System.out.println(matcher.group(1));

1voto

Shirik Points 1517

Je préfixe cette réponse par "vous ne devez pas utiliser d'expression régulière pour analyser XML - cela ne fera que créer des cas extrêmes qui ne fonctionneront pas correctement et une regex de complexité de plus en plus complexe pendant que vous essayez de résoudre ce problème." "

Cela étant dit, vous devez procéder en faisant correspondre la chaîne et en saisissant le groupe souhaité:

 if (m.matches())
{
   String result = m.group(1);
   // do something with result
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X