Recherche de modèle avec Grep en Java
1. Vue d'ensemble
2. Contexte
Unix a une commande puissante appeléegrep - qui signifie «global regular expression print». Il recherche le motif ou une expression régulière dans un ensemble de fichiers donné.
On peut utiliser zéro ou plusieurs options avec la commande grep pour enrichir le résultat de la recherche que nous examinerions plus en détail dans la section à venir.
Si vous utilisez Windows, vous pouvez installer bash comme indiqué dans l'articlehere.
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 Unix grep en Java.
3.1. Configuration de la construction
Ajoutez la dépendance suivante à vospom.xml oubuild.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 motif 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
Next - Voyons comment utiliser la bibliothèque Grep4J pour grep un motif d’un fichier résidant soit localement, soit ailleurs.
Dans l'exemple suivant, nous verrons comment traduire les commandes Unix grep en Java.
4.1. Configuration de la construction
Ajoutez la dépendance suivante à vospom.xml oubuild.gradle:
com.googlecode.grep4j
grep4j
1.8.7
4.2. Exemples de Grep
Exemple de grep en Java i.e. é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 motif 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 / s donné à l'aide deGrep4j etUnix4J.
L'implémentation de ces exemples peut être trouvée dansthe GitHub project - 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 égalementthe regex functionality dans le JDK.