Recherche de modèle avec Grep en Java

Recherche de modèle avec Grep en Java

1. Vue d'ensemble

Dans ce didacticiel - nous allons apprendre àsearch for a pattern in a given file/s - utiliser Java et des bibliothèques tierces telles queUnix4J etGrep4J.

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.