Рубрики
Без рубрики

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

Узнайте, как писать логику, подобную grep, на Java.

Автор оригинала: baeldung.

1. Обзор

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

2. Предыстория

В Unix есть мощная команда под названием grep , которая расшифровывается как ” global regular expression print “. Он ищет шаблон или регулярное выражение в заданном наборе файлов.

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

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

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

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

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

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

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


    org.unix4j
    unix4j-command
    0.4

3.2. Пример с Grep

Пример grep в Unix:

grep "NINETEEN" dictionary.txt

Эквивалентом в Java является:

@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());
}

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

grep -v "NINETEEN" dictionary.txt

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

@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()); 
}

Давайте посмотрим, как мы можем использовать регулярное выражение для поиска шаблона в файле. Вот версия 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 для создания шаблона в файле, находящемся локально или где-то в удаленном месте.

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

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

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


    com.googlecode.grep4j
    grep4j
    1.8.7

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.