Перейти к основному содержимому

Поиск шаблонов с помощью Grep в Java

· 3 мин. чтения

1. Обзор

В этом руководстве мы узнаем, как искать шаблон в заданном файле/файлах, используя Java и сторонние библиотеки, такие как Unix4J и Grep4J .

2. Фон

В Unix есть мощная команда под названием grep , что означает « печать глобальных регулярных выражений ». Он ищет шаблон или регулярное выражение в заданном наборе файлов.

Можно использовать ноль или более параметров вместе с командой grep, чтобы обогатить результат поиска, который мы подробно рассмотрим в следующем разделе.

Если вы используете Windows, вы можете установить bash, как указано в посте здесь .

3. С библиотекой Unix4j

Во-первых, давайте посмотрим, как использовать библиотеку Unix4J для поиска шаблона в файле.

В следующем примере мы рассмотрим, как перевести команды Unix grep в Java.

3.1. Конфигурация сборки

Добавьте следующую зависимость к вашему pom.xml или build.gradle :

<dependency>
<groupId>org.unix4j</groupId>
<artifactId>unix4j-command</artifactId>
<version>0.4</version>
</dependency>

3.2. Пример с Грепом

Пример grep в Unix:

grep "NINETEEN" dictionary.txt

Эквивалент в Java:

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

assertEquals(expectedLineCount, lines.size());
}

Другой пример, где мы можем использовать обратный текстовый поиск в файле. Вот версия Unix того же самого:

grep -v "NINETEEN" dictionary.txt

Вот Java-версия приведенной выше команды:

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

assertEquals(expectedLineCount, lines.size());
}

Давайте посмотрим, как мы можем использовать регулярное выражение для поиска шаблона в файле. Вот версия Unix для подсчета всех шаблонов регулярных выражений, найденных во всем файле:

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

Вот Java-версия приведенной выше команды:

@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. С Grep4J

Далее — давайте посмотрим, как использовать библиотеку Grep4J для поиска шаблона в файле, находящемся либо локально, либо где-то в удаленном месте.

В следующем примере мы рассмотрим, как перевести команды Unix grep в Java.

4.1. Конфигурация сборки

Добавьте следующую зависимость к вашему pom.xml или build.gradle :

<dependency>
<groupId>com.googlecode.grep4j</groupId>
<artifactId>grep4j</artifactId>
<version>1.8.7</version>
</dependency>

4.2. Grep Примеры

Образец grep в Java, т.е. эквивалент:

grep "NINETEEN" dictionary.txt

Вот версия команды для 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());
}

Другой пример, где мы можем использовать обратный текстовый поиск в файле. Вот версия Unix того же самого:

grep -v "NINETEEN" dictionary.txt

А вот и 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());
}

Давайте посмотрим, как мы можем использовать регулярное выражение для поиска шаблона в файле. Вот версия Unix для подсчета всех шаблонов регулярных выражений, найденных во всем файле:

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

Вот версия Java:

@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. Вывод

В этом кратком руководстве мы проиллюстрировали поиск шаблона в заданных файлах с использованием Grep4j и Unix4J .

Реализацию этих примеров можно найти в проекте GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.

Наконец, вы можете естественным образом выполнять некоторые базовые функции, подобные grep, используя функции регулярных выражений в JDK.