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.