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