Recherche de modèles avec Grep en Java

1. Vue d'ensemble

Dans ce tutoriel - nous allons apprendre à rechercher un modèle dans un fichier / s donné - en utilisant Java et des bibliothèques tierces telles que Unix4J et Grep4J.

2. Arrière plan

Unix a une commande puissante appelée grep - qui signifie « impression d'expression régulière globale ». Il recherche le modèle ou une expression régulière dans un ensemble donné de fichiers.

On peut utiliser zéro ou plusieurs options avec la commande grep pour enrichir le résultat de la recherche que nous examinerons en détails dans la section suivante.

Si vous utilisez Windows, vous pouvez installer bash comme mentionné dans l'article ici.

3. Avec la bibliothèque unix4j

Tout d'abord, voyons comment utiliser la bibliothèque Unix4J pour grep un motif dans un fichier.

Dans l'exemple suivant, nous verrons comment traduire les commandes grep Unix en Java.

3.1. Configuration de la construction

Ajoutez la dépendance suivante à votre pom.xml ou build.gradle :

 org.unix4j unix4j-command 0.4 

3.2. Exemple avec Grep

Exemple de grep sous Unix:

grep "NINETEEN" dictionary.txt 

L'équivalent en Java est:

@Test public void whenGrepWithSimpleString_thenCorrect() { int expectedLineCount = 4; File file = new File("dictionary.txt"); List lines = Unix4j.grep("NINETEEN", file).toLineList(); assertEquals(expectedLineCount, lines.size()); } 

Un autre exemple est celui où nous pouvons utiliser la recherche de texte inverse dans un fichier. Voici la version Unix de la même chose:

grep -v "NINETEEN" dictionary.txt 

Voici la version Java de la commande ci-dessus:

@Test public void whenInverseGrepWithSimpleString_thenCorrect() { int expectedLineCount = 178687; File file = new File("dictionary.txt"); List lines = Unix4j.grep(Grep.Options.v, "NINETEEN", file). toLineList(); assertEquals(expectedLineCount, lines.size()); } 

Voyons comment nous pouvons utiliser une expression régulière pour rechercher un modèle dans un fichier. Voici la version Unix pour compter tous les modèles d'expression régulière trouvés dans tout le fichier:

grep -c ".*?NINE.*?" dictionary.txt 

Voici la version Java de la commande ci-dessus:

@Test public void whenGrepWithRegex_thenCorrect() { int expectedLineCount = 151; File file = new File("dictionary.txt"); String patternCount = Unix4j.grep(Grep.Options.c, ".*?NINE.*?", file). cut(CutOption.fields, ":", 1).toStringResult(); assertEquals(expectedLineCount, patternCount); }

4. Avec Grep4J

Ensuite, voyons comment utiliser la bibliothèque Grep4J pour grep un motif dans un fichier résidant localement ou quelque part dans un emplacement distant.

Dans l'exemple suivant, nous verrons comment traduire les commandes grep Unix en Java.

4.1. Configuration de la construction

Ajoutez la dépendance suivante à votre pom.xml ou build.gradle :

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Exemples de Grep

Exemple de grep en Java, soit l'équivalent de:

grep "NINETEEN" dictionary.txt 

Voici la version Java de la commande:

@Test public void givenLocalFile_whenGrepWithSimpleString_thenCorrect() { int expectedLineCount = 4; Profile localProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). onLocalhost().build(); GrepResults results = Grep4j.grep(Grep4j.constantExpression("NINETEEN"), localProfile); assertEquals(expectedLineCount, results.totalLines()); } 

Un autre exemple est celui où nous pouvons utiliser la recherche de texte inverse dans un fichier. Voici la version Unix de la même chose:

grep -v "NINETEEN" dictionary.txt 

Et voici la version Java:

@Test public void givenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect() { int expectedLineCount = 178687; Profile remoteProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). filePath("/tmp/dictionary.txt"). onRemotehost("172.168.192.1"). credentials("user", "pass").build(); GrepResults results = Grep4j.grep( Grep4j.constantExpression("NINETEEN"), remoteProfile, Option.invertMatch()); assertEquals(expectedLineCount, results.totalLines()); } 

Voyons comment nous pouvons utiliser une expression régulière pour rechercher un modèle dans un fichier. Voici la version Unix pour compter tous les modèles d'expression régulière trouvés dans tout le fichier:

grep -c ".*?NINE.*?" dictionary.txt 

Voici la version Java:

@Test public void givenLocalFile_whenGrepWithRegex_thenCorrect() { int expectedLineCount = 151; Profile localProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). onLocalhost().build(); GrepResults results = Grep4j.grep( Grep4j.regularExpression(".*?NINE.*?"), localProfile, Option.countMatches()); assertEquals(expectedLineCount, results.totalLines()); }

5. Conclusion

Dans ce tutoriel rapide, nous avons illustré la recherche d'un motif dans un fichier donné en utilisant Grep4j et Unix4J .

L'implémentation de ces exemples peut être trouvée dans le projet GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.

Enfin, vous pouvez naturellement faire certaines des bases de la fonctionnalité de type grep en utilisant également la fonctionnalité regex dans le JDK.