java code

parser un texte avec les classes Pattern et Matcher

Pour ce nouveau tutoriel Java, nous allons voir comment parser un fichier texte et en extraire des données correspondant à un pattern, c’est à dire à une structure bien précise. Pour cela, nous utiliserons une expression régulière ainsi que les classes Pattern et Matcher.

Imaginez pour commencer que vous disposez d’un fichier texte dont le contenu est le suivant :

Ce texte est utilisé pour illustrer l'utilisation des classes <ins>Scanner</ins>
et <ins>Pattern</ins> en <ins>Java</ins> dans le but de parser un texte et d'en extraire des parties.
Le tutoriel est disponible sur blog.garylong.fr, section <ins>Java</ins>.

Vous souhaitez en extraire les parties entourées par des balises (comme pour parser un fichier html par exemple !) de type <…> </…>. Il faut donc avant tout créer une expression régulière qui corresponde à ce type de séquence. Pour ce faire, vous avez plusieurs possibilités. Soit vous connaissez très bien la syntaxe des expressions régulières, soit vous pouvez utiliser ce générateur de regex, ou encore installer le plugin QuickREx pour Eclipse.

L’expression régulière qui correspond au pattern qui nous intéresse est la suivante :
<[a-z]+>[^\>].+?<\/[a-z]+>

Maintenant, créons notre Pattern :

Pattern pattern = Pattern.compile("<[a-z]+>[^\\>].+?<\\/[a-z]+>");

Ensuite, récupérons le contenu de notre fichier texte sous forme de String :

File file = new File("resources/test.txt");
 String fileContent = readFileAsString(file.getAbsolutePath());

La méthode readFileAsString(String path) utilise un bufferedInputStream pour extraire le contenu du fichier texte :

private static String readFileAsString(String filePath) throws java.io.IOException{
 byte[] buffer = new byte[(int) new File(filePath).length()];
 BufferedInputStream f = null;
 try {
 f = new BufferedInputStream(new FileInputStream(filePath));
 f.read(buffer);
 } finally {
 if (f != null) try { f.close(); } catch (IOException ignored) { }
 }
 return new String(buffer);
 }

Après avoir récupéré notre texte, nous utilisons un Matcher qui contiendra les parties du texte correspondant au pattern :

Matcher match = pattern.matcher(fileContent);

Enfin, il suffit de boucler sur ce matcher pour récupérer toutes les éléments concernés :

while(match.find()){
 System.out.println("extrait : " + match.group());
 }

C’est tout ^^ ! En fait, c’est assez simple :) Vous pouvez stocker vos données dans une List ou bien les injecter dans un document PDF pour en sortir un résumé, etc. À vous de voir :)

Voici le code complet de la classe :

package fr.followthecode.fileparser;

/**
 * @author Gary
 *
 * http://blog.garylong.fr
 * programmation et logiciels libres
 */

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileParser {

 /**
 * @param args
 * @throws IOException
 */
 public static void main(String[] args) throws IOException {

 Pattern pattern = Pattern.compile("<[a-z]+>[^\\>].+?<\\/[a-z]+>");
 File file = new File("resources/test.txt");
 String fileContent = readFileAsString(file.getAbsolutePath());

 Matcher match = pattern.matcher(fileContent);
 while(match.find()){
 System.out.println("extrait : " + match.group());
 }
 }

 private static String readFileAsString(String filePath) throws java.io.IOException{
 byte[] buffer = new byte[(int) new File(filePath).length()];
 BufferedInputStream f = null;
 try {
 f = new BufferedInputStream(new FileInputStream(filePath));
 f.read(buffer);
 } finally {
 if (f != null) try { f.close(); } catch (IOException ignored) { }
 }
 return new String(buffer);
 }
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *