Vyhľadávanie vzorov s Grepom v Jave

1. Prehľad

V tejto príručke sa dozvieme, ako na to vyhľadať vzor v danom súbore / súboroch - pomocou Javy a knižníc tretích strán, ako sú Unix4J a Grep4J.

2. Pozadie

Unix má výkonný príkaz s názvom grep - čo znamená „ tlač globálneho regulárneho výrazu „. Vyhľadá vzor alebo regulárny výraz v rámci danej sady súborov.

Jeden môže použiť nulu alebo viac možností spolu s príkazom grep na obohatenie výsledku vyhľadávania, ktorý by sme podrobnejšie preskúmali v nasledujúcej časti.

Ak používate Windows, môžete si nainštalovať bash, ako je uvedené v príspevku tu.

3. S knižnicou unix4j

Najprv sa pozrime, ako používať knižnicu Unix4J na grepovanie vzoru v súbore.

V nasledujúcom príklade sa pozrieme na to, ako preložiť Unix grep príkazy v Jave.

3.1. Vytvoriť konfiguráciu

Pridajte nasledujúcu závislosť na vašom pom.xml alebo build.gradle:

 org.unix4j príkaz unix4j 0.4 

3.2. Príklad s Grep

Ukážka grep v Unixe:

grep "NINETEEN" slovník.txt 

Ekvivalent v Jave je:

@ Test public void whenGrepWithSimpleString_thenCorrect () {int expectLineCount = 4; Súbor súbor = nový Súbor ("dictionary.txt"); Zoznam riadkov = Unix4j.grep ("NINETEEN", súbor) .toLineList (); assertEquals (expectLineCount, lines.size ()); } 

Ďalším príkladom je miesto, kde môžeme použiť inverzné textové vyhľadávanie v súbore. Tu je rovnaká verzia systému Unix:

grep -v slovník "NINETEEN" .txt 

Tu je verzia Java vyššie uvedeného príkazu:

@ Test public void whenInverseGrepWithSimpleString_thenCorrect () {int expectLineCount = 178687; File file = new File ("dictionary.txt"); Zoznam riadkov = Unix4j.grep (Grep.Options.v, "NINETEEN", súbor). toLineList (); assertEquals (expectLineCount, lines.size ()); } 

Pozrime sa, ako môžeme pomocou regulárneho výrazu vyhľadať vzor v súbore. Tu je verzia pre Unix, ktorá počíta všetky vzory regulárnych výrazov nájdené v celom súbore:

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

Tu je verzia Java vyššie uvedeného príkazu:

@ Test public void whenGrepWithRegex_thenCorrect () {int expectLineCount = 151; Súbor súbor = nový Súbor ("dictionary.txt"); Reťazec patternCount = Unix4j.grep (Grep.Options.c, ". *? NINE. *?", Súbor). cut (CutOption.fields, ":", 1) .toStringResult (); assertEquals (expectLineCount, patternCount); }

4. S Grep4J

Ďalej - pozrime sa, ako používať knižnicu Grep4J na grepovanie vzoru v súbore umiestnenom lokálne alebo niekde na vzdialenom mieste.

V nasledujúcom príklade sa pozrieme na to, ako preložiť Unix grep príkazy v Jave.

4.1. Vytvoriť konfiguráciu

Pridajte nasledujúcu závislosť na vašom pom.xml alebo build.gradle:

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Príklady grep

Ukážka grep v Jave, tj. Ekvivalent:

grep "NINETEEN" slovník.txt 

Tu je verzia príkazu Java:

@Test public void givenLocalFile_whenGrepWithSimpleString_thenCorrect () {int expectLineCount = 4; Profil localProfile = ProfileBuilder.newBuilder (). name ("dictionary.txt"). filePath ("."). onLocalhost (). build (); GrepResults results = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), localProfile); assertEquals (expectLineCount, results.totalLines ()); } 

Ďalším príkladom je miesto, kde môžeme použiť inverzné textové vyhľadávanie v súbore. Tu je rovnaká verzia systému Unix:

grep -v slovník "NINETEEN" .txt 

A tu je verzia Java:

@Test public void givenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect () {int expectLineCount = 178687; Profil remoteProfile = ProfileBuilder.newBuilder (). name ("dictionary.txt"). filePath ("."). filePath ("/ tmp / dictionary.txt"). onRemotehost ("172.168.192.1"). poverenia („užívateľ“, „prístup“). build (); GrepResults results = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), remoteProfile, Option.invertMatch ()); assertEquals (expectLineCount, results.totalLines ()); } 

Pozrime sa, ako môžeme pomocou regulárneho výrazu vyhľadať vzor v súbore. Tu je verzia pre Unix, ktorá počíta všetky vzory regulárnych výrazov nájdené v celom súbore:

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

Tu je verzia Java:

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

5. Záver

V tomto rýchlom návode sme ilustrovali hľadanie vzoru v danom súbore pomocou Grep4j a Unix4J.

Implementáciu týchto príkladov možno nájsť v projekte GitHub - jedná sa o projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.

Nakoniec môžete samozrejme urobiť niektoré zo základných funkcií grep pomocou funkcie regulárneho výrazu aj v JDK.


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