Pencarian Pola dengan Grep di Java

1. Ikhtisar

Dalam tutorial ini - kita akan belajar cara mencari pola dalam file / s tertentu - menggunakan Java dan pustaka pihak ketiga seperti Unix4J dan Grep4J.

2. Latar Belakang

Unix memiliki perintah kuat yang disebut grep - yang merupakan singkatan dari " cetak ekspresi reguler global ". Ini mencari pola atau ekspresi reguler dalam satu set file.

Seseorang dapat menggunakan nol atau lebih opsi bersama dengan perintah grep untuk memperkaya hasil pencarian yang akan kita lihat detailnya di bagian selanjutnya.

Jika Anda menggunakan Windows, Anda dapat menginstal bash seperti yang disebutkan dalam posting di sini.

3. Dengan Perpustakaan unix4j

Pertama, mari kita lihat bagaimana menggunakan pustaka Unix4J untuk membuat pola dalam sebuah file.

Dalam contoh berikut - kita akan melihat bagaimana menerjemahkan perintah grep Unix di Java.

3.1. Bangun Konfigurasi

Tambahkan dependensi berikut di pom.xml atau build.gradle Anda :

 org.unix4j unix4j-command 0.4 

3.2. Contoh dengan Grep

Contoh grep di Unix:

grep "NINETEEN" dictionary.txt 

Setara di Java adalah:

@Test public void whenGrepWithSimpleString_thenCorrect() { int expectedLineCount = 4; File file = new File("dictionary.txt"); List lines = Unix4j.grep("NINETEEN", file).toLineList(); assertEquals(expectedLineCount, lines.size()); } 

Contoh lain adalah di mana kita dapat menggunakan pencarian teks terbalik dalam sebuah file. Inilah versi Unix yang sama:

grep -v "NINETEEN" dictionary.txt 

Berikut versi Java dari perintah di atas:

@Test public void whenInverseGrepWithSimpleString_thenCorrect() { int expectedLineCount = 178687; File file = new File("dictionary.txt"); List lines = Unix4j.grep(Grep.Options.v, "NINETEEN", file). toLineList(); assertEquals(expectedLineCount, lines.size()); } 

Mari kita lihat, bagaimana kita dapat menggunakan ekspresi reguler untuk mencari pola dalam sebuah file. Berikut versi Unix untuk menghitung semua pola ekspresi reguler yang ditemukan di seluruh file:

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

Berikut versi Java dari perintah di atas:

@Test public void whenGrepWithRegex_thenCorrect() { int expectedLineCount = 151; File file = new File("dictionary.txt"); String patternCount = Unix4j.grep(Grep.Options.c, ".*?NINE.*?", file). cut(CutOption.fields, ":", 1).toStringResult(); assertEquals(expectedLineCount, patternCount); }

4. Dengan Grep4J

Selanjutnya - mari kita lihat bagaimana menggunakan pustaka Grep4J untuk membuat pola dalam file yang berada secara lokal atau di suatu tempat di lokasi yang jauh.

Dalam contoh berikut - kita akan melihat bagaimana menerjemahkan perintah grep Unix di Java.

4.1. Bangun Konfigurasi

Tambahkan dependensi berikut di pom.xml atau build.gradle Anda :

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Contoh Grep

Contoh grep di Java yaitu setara dengan:

grep "NINETEEN" dictionary.txt 

Berikut versi perintah Java:

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

Contoh lain adalah di mana kita dapat menggunakan pencarian teks terbalik dalam sebuah file. Inilah versi Unix yang sama:

grep -v "NINETEEN" dictionary.txt 

Dan inilah versi Java:

@Test public void givenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect() { int expectedLineCount = 178687; Profile remoteProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). filePath("/tmp/dictionary.txt"). onRemotehost("172.168.192.1"). credentials("user", "pass").build(); GrepResults results = Grep4j.grep( Grep4j.constantExpression("NINETEEN"), remoteProfile, Option.invertMatch()); assertEquals(expectedLineCount, results.totalLines()); } 

Mari kita lihat, bagaimana kita dapat menggunakan ekspresi reguler untuk mencari pola dalam sebuah file. Berikut versi Unix untuk menghitung semua pola ekspresi reguler yang ditemukan di seluruh file:

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

Ini versi Java-nya:

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

5. Kesimpulan

Dalam tutorial singkat ini, kami mengilustrasikan mencari pola dalam file tertentu menggunakan Grep4j dan Unix4J .

Implementasi contoh-contoh ini dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.

Akhirnya, Anda secara alami dapat melakukan beberapa dasar dari fungsionalitas mirip grep menggunakan fungsi regex di JDK juga.