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"); Listlines = 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"); Listlines = 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.