Patroon zoeken met Grep in Java

1. Overzicht

In deze zelfstudie leren we hoe u dat moet doen zoek naar een patroon in een gegeven bestand / bestanden - het gebruik van Java en bibliotheken van derden, zoals Unix4J en Grep4J.

2. Achtergrond

Unix heeft een krachtig commando genaamd grep - wat staat voor " globale reguliere expressie print “. Het zoekt naar het patroon of een reguliere expressie binnen een bepaalde set bestanden.

Men kan nul of meer opties gebruiken samen met het grep-commando om het zoekresultaat te verrijken, dat we in de komende sectie in details zouden bekijken.

Als u Windows gebruikt, kunt u bash installeren zoals vermeld in het bericht hier.

3. Met unix4j-bibliotheek

Laten we eerst eens kijken hoe we de Unix4J-bibliotheek kunnen gebruiken om een ​​patroon in een bestand te grepen.

In het volgende voorbeeld zullen we kijken hoe we de Unix grep-commando's in Java kunnen vertalen.

3.1. Buildconfiguratie

Voeg de volgende afhankelijkheid toe aan uw pom.xml of build.gradle:

 org.unix4j unix4j-commando 0.4 

3.2. Voorbeeld met Grep

Voorbeeld grep in Unix:

grep "NINETEEN" woordenboek.txt 

Het equivalent in Java is:

@ Test openbare leegte whenGrepWithSimpleString_thenCorrect () {int verwachteLineCount = 4; Bestandsbestand = nieuw bestand ("woordenboek.txt"); Lijstregels = Unix4j.grep ("NINETEEN", bestand) .toLineList (); assertEquals (verwachtLineCount, lines.size ()); } 

Een ander voorbeeld is waar we inverse tekstzoekopdrachten in een bestand kunnen gebruiken. Hier is de Unix-versie van hetzelfde:

grep -v "NINETEEN" woordenboek.txt 

Hier is de Java-versie van de bovenstaande opdracht:

@ Test openbare leegte whenInverseGrepWithSimpleString_thenCorrect () {int verwachteLineCount = 178687; Bestandsbestand = nieuw bestand ("woordenboek.txt"); Lijstregels = Unix4j.grep (Grep.Options.v, "NINETEEN", bestand). toLineList (); assertEquals (verwachtLineCount, lines.size ()); } 

Laten we eens kijken, hoe we reguliere expressies kunnen gebruiken om naar een patroon in een bestand te zoeken. Hier is de Unix-versie om alle reguliere expressiepatronen te tellen die in het hele bestand zijn gevonden:

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

Hier is de Java-versie van de bovenstaande opdracht:

@ Test openbare leegte whenGrepWithRegex_thenCorrect () {int verwachteLineCount = 151; Bestandsbestand = nieuw bestand ("woordenboek.txt"); String patternCount = Unix4j.grep (Grep.Options.c, ". *? NINE. *?", Bestand). cut (CutOption.fields, ":", 1) .toStringResult (); assertEquals (verwachtLineCount, patternCount); }

4. Met Grep4J

Vervolgens - laten we eens kijken hoe we de Grep4J-bibliotheek kunnen gebruiken om een ​​patroon te grepen in een bestand dat zich lokaal of ergens op een externe locatie bevindt.

In het volgende voorbeeld zullen we kijken hoe we de Unix grep-commando's in Java vertalen.

4.1. Buildconfiguratie

Voeg de volgende afhankelijkheid toe aan uw pom.xml of build.gradle:

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Grep-voorbeelden

Voorbeeld grep in Java, d.w.z. equivalent van:

grep "NINETEEN" woordenboek.txt 

Hier is de Java-versie van het commando:

@Test openbare ongeldige gegevenLocalFile_whenGrepWithSimpleString_thenCorrect () {int verwachtLineCount = 4; Profiel localProfile = ProfileBuilder.newBuilder (). naam ("woordenboek.txt"). filePath ("."). onLocalhost (). build (); GrepResults-resultaten = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), localProfile); assertEquals (verwachtLineCount, resultaten.totalLines ()); } 

Een ander voorbeeld is waar we inverse tekstzoekopdrachten in een bestand kunnen gebruiken. Hier is de Unix-versie van hetzelfde:

grep -v "NINETEEN" woordenboek.txt 

En hier is de Java-versie:

@ Test openbare ongeldig gegevenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect () {int verwachtLineCount = 178687; Profiel remoteProfile = ProfileBuilder.newBuilder (). naam ("woordenboek.txt"). filePath ("."). filePath ("/ tmp / dictionary.txt"). onRemotehost ("172.168.192.1"). inloggegevens ("gebruiker", "pass"). build (); GrepResults-resultaten = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), remoteProfile, Option.invertMatch ()); assertEquals (verwachtLineCount, resultaten.totalLines ()); } 

Laten we eens kijken, hoe we reguliere expressies kunnen gebruiken om naar een patroon in een bestand te zoeken. Hier is de Unix-versie om alle reguliere expressiepatronen te tellen die in het hele bestand zijn gevonden:

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

Hier is de Java-versie:

@Test openbare leegte gegevenLocalFile_whenGrepWithRegex_thenCorrect () {int verwachtLineCount = 151; Profiel localProfile = ProfileBuilder.newBuilder (). naam ("woordenboek.txt"). filePath ("."). onLocalhost (). build (); GrepResults-resultaten = Grep4j.grep (Grep4j. RegularExpression (". *? NINE. *?"), LocalProfile, Option.countMatches ()); assertEquals (verwachtLineCount, resultaten.totalLines ()); }

5. Conclusie

In deze korte tutorial hebben we het zoeken naar een patroon in een bepaald bestand (en) geïllustreerd met behulp van Grep4j en Unix4J.

De implementatie van deze voorbeelden is te vinden in het GitHub-project - dit is een op Maven gebaseerd project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.

Ten slotte kunt u natuurlijk ook enkele van de basisprincipes van grep-achtige functionaliteit uitvoeren met behulp van de regex-functionaliteit in de JDK.


$config[zx-auto] not found$config[zx-overlay] not found