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å.