Mønstersøgning med Grep i Java

1. Oversigt

I denne vejledning lærer vi, hvordan man gør det søg efter et mønster i en given fil / filer - ved hjælp af Java og tredjepartsbiblioteker såsom Unix4J og Grep4J.

2. Baggrund

Unix har en stærk kommando kaldet grep - som står for “ global regulært udtryk print “. Det søger efter mønsteret eller et regulært udtryk inden for et givet sæt filer.

Man kan bruge nul eller flere muligheder sammen med grep-kommandoen for at berige søgeresultatet, som vi vil se nærmere på i det kommende afsnit.

Hvis du bruger Windows, kan du installere bash som nævnt i indlægget her.

3. Med unix4j-bibliotek

Lad os først se, hvordan vi bruger Unix4J-biblioteket til at grep et mønster i en fil.

I det følgende eksempel - vi vil se på, hvordan vi oversætter Unix grep-kommandoerne i Java.

3.1. Byg konfiguration

Tilføj følgende afhængighed af din pom.xml eller build.gradle:

 org.unix4j unix4j-kommando 0.4 

3.2. Eksempel med Grep

Eksempel på grep i Unix:

grep "NINETEEN" dictionary.txt 

Ækvivalenten i Java er:

@Test offentlig ugyldig nårGrepWithSimpleString_thenCorrect () {int forventetLineCount = 4; Filfil = ny fil ("dictionary.txt"); Listelinjer = Unix4j.grep ("NINETEEN", fil) .toLineList (); assertEquals (expectLineCount, lines.size ()); } 

Et andet eksempel er, hvor vi kan bruge invers tekstsøgning i en fil. Her er Unix-versionen af ​​det samme:

grep -v "NINETEEN" dictionary.txt 

Her er Java-versionen af ​​ovenstående kommando:

@Test offentlig ugyldig nårInverseGrepWithSimpleString_thenCorrect () {int forventetLineCount = 178687; Filfil = ny fil ("dictionary.txt"); Listelinjer = Unix4j.grep (Grep.Options.v, "NINETEEN", fil). toLineList (); assertEquals (expectLineCount, lines.size ()); } 

Lad os se, hvordan vi kan bruge regulært udtryk til at søge efter et mønster i en fil. Her er Unix-versionen, der tæller alt det regulære udtryksmønster, der findes i hele filen:

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

Her er Java-versionen af ​​ovenstående kommando:

@Test offentlig ugyldig nårGrepWithRegex_thenCorrect () {int forventetLineCount = 151; Filfil = ny fil ("dictionary.txt"); StrengmønsterCount = Unix4j.grep (Grep.Options.c, ". *? NINE. *?", Fil). klip (CutOption.fields, ":", 1) .toStringResult (); assertEquals (expectLineCount, patternCount); }

4. Med Grep4J

Dernæst - lad os se, hvordan du bruger Grep4J-biblioteket til at grep et mønster i en fil, der findes enten lokalt eller et andet sted på en fjernplacering.

I det følgende eksempel - vi vil se på, hvordan vi oversætter Unix grep-kommandoerne i Java.

4.1. Byg konfiguration

Tilføj følgende afhængighed af din pom.xml eller build.gradle:

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Grep eksempler

Eksempel på grep i Java, dvs. svarende til:

grep "NINETEEN" dictionary.txt 

Her er Java-versionen af ​​kommandoen:

@Test offentligt ugyldigt givenLocalFile_whenGrepWithSimpleString_thenCorrect () {int expectedLineCount = 4; Profil localProfile = ProfileBuilder.newBuilder (). navn ("dictionary.txt"). filePath ("."). onLocalhost (). build (); GrepResults-resultater = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), localProfile); assertEquals (expectLineCount, results.totalLines ()); } 

Et andet eksempel er, hvor vi kan bruge invers tekstsøgning i en fil. Her er Unix-versionen af ​​det samme:

grep -v "NINETEEN" dictionary.txt 

Og her er Java-versionen:

@Test offentlig ugyldighed givenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect () {int expectedLineCount = 178687; Profil remoteProfile = ProfileBuilder.newBuilder (). navn ("dictionary.txt"). filePath ("."). filePath ("/ tmp / dictionary.txt"). onRemotehost ("172.168.192.1"). legitimationsoplysninger ("bruger", "bestå"). build (); GrepResults-resultater = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), remoteProfile, Option.invertMatch ()); assertEquals (expectLineCount, results.totalLines ()); } 

Lad os se, hvordan vi kan bruge regulært udtryk til at søge efter et mønster i en fil. Her er Unix-versionen, der tæller alt det regulære udtryksmønster, der findes i hele filen:

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

Her er Java-versionen:

@Test offentlig ugyldighed givenLocalFile_whenGrepWithRegex_thenCorrect () {int forventetLineCount = 151; Profil localProfile = ProfileBuilder.newBuilder (). navn ("dictionary.txt"). filePath ("."). onLocalhost (). build (); GrepResults-resultater = Grep4j.grep (Grep4j.regularExpression (". *? NINE. *?"), LocalProfile, Option.countMatches ()); assertEquals (expectLineCount, results.totalLines ()); }

5. Konklusion

I denne hurtige vejledning illustrerede vi søgen efter et mønster i en given fil / r ved hjælp af Grep4j og Unix4J.

Implementeringen af ​​disse eksempler findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.

Endelig kan du naturligvis gøre nogle af de grundlæggende funktioner i grep-lignende funktionalitet ved hjælp af regex-funktionaliteten i JDK også.