Поиск по шаблону с Grep в Java

Поиск по шаблону с Grep в Java

1. обзор

В этом руководстве мы узнаем, какsearch for a pattern in a given file/s - использовать Java и сторонние библиотеки, такие какUnix4J иGrep4J.

2. Фон

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

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

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

3. с библиотекой unix4j

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

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

В следующем примере - мы рассмотрим, как переводить команды Unix grep в 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.

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

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