Mønstersøk med Grep i Java

1. Oversikt

I denne opplæringen - lærer vi hvordan du gjør det søk etter et mønster i en gitt fil / er - bruker Java og tredjepartsbiblioteker som Unix4J og Grep4J.

2. Bakgrunn

Unix har en kraftig kommando kalt grep - som står for “ global regulært uttrykk “. Den søker etter mønsteret eller et vanlig uttrykk i et gitt sett med filer.

Man kan bruke null eller flere alternativer sammen med grep-kommandoen for å berike søkeresultatet som vi vil se på detaljer i den neste delen.

Hvis du bruker Windows, kan du installere bash som nevnt i innlegget her.

3. Med unix4j-bibliotek

La oss først se hvordan vi bruker Unix4J-biblioteket til å grep et mønster i en fil.

I det følgende eksemplet - vi vil se på hvordan vi oversetter Unix grep-kommandoene i Java.

3.1. Bygg konfigurasjon

Legg til følgende avhengighet av 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 

Tilsvarende i Java er:

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

Et annet eksempel er hvor vi kan bruke invers tekstsøk i en fil. Her er Unix-versjonen av det samme:

grep -v "NINETEEN" dictionary.txt 

Her er Java-versjonen av kommandoen ovenfor:

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

La oss se hvordan vi kan bruke vanlig uttrykk for å søke etter et mønster i en fil. Her er Unix-versjonen for å telle alt det vanlige uttrykksmønsteret som finnes i hele filen:

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

Her er Java-versjonen av kommandoen ovenfor:

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

4. Med Grep4J

Neste - la oss se hvordan du bruker Grep4J-biblioteket til å grep et mønster i en fil som ligger enten lokalt eller et annet sted.

I det følgende eksemplet - vi vil se på hvordan vi oversetter Unix grep-kommandoene i Java.

4.1. Bygg konfigurasjon

Legg til følgende avhengighet av din pom.xml eller build.gradle:

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Grep eksempler

Eksempel på grep i Java, dvs. tilsvarer:

grep "NINETEEN" dictionary.txt 

Her er Java-versjonen av kommandoen:

@Test offentlig ugyldig givenLocalFile_whenGrepWithSimpleString_thenCorrect () {int expectedLineCount = 4; Profil localProfile = ProfileBuilder.newBuilder (). navn ("ordbok.txt"). filePath ("."). onLocalhost (). bygge (); GrepResults resultater = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), localProfile); assertEquals (expectLineCount, results.totalLines ()); } 

Et annet eksempel er hvor vi kan bruke invers tekstsøk i en fil. Her er Unix-versjonen av det samme:

grep -v "NINETEEN" dictionary.txt 

Og her er Java-versjonen:

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

La oss se hvordan vi kan bruke vanlig uttrykk for å søke etter et mønster i en fil. Her er Unix-versjonen for å telle alt det vanlige uttrykksmønsteret som finnes i hele filen:

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

Her er Java-versjonen:

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

5. Konklusjon

I denne raske opplæringen illustrerte vi å søke etter et mønster i en gitt fil / er ved hjelp av Grep4j og Unix4J.

Implementeringen av disse eksemplene finnes i GitHub-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.

Til slutt kan du naturlig nok gjøre noen av det grunnleggende om grep-lignende funksjonalitet ved å bruke regex-funksjonaliteten i JDK også.