Търсене на образец с Grep в Java

1. Общ преглед

В този урок - ще научим как да търсим шаблон в даден файл / и - с помощта на Java и библиотеки на трети страни като Unix4J и Grep4J.

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

Unix има мощна команда, наречена grep - което означава „ глобален печат на регулярни изрази “. Той търси модела или регулярния израз в рамките на даден набор от файлове.

Човек може да използва нула или повече опции заедно с командата grep, за да обогати резултата от търсенето, който бихме разгледали подробно в следващия раздел.

Ако използвате Windows, можете да инсталирате bash, както е споменато в публикацията тук.

3. С библиотека unix4j

Първо, нека видим как да използваме библиотеката Unix4J за grep на шаблон във файл.

В следващия пример - ще разгледаме как да преведем Unip 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, за да grep модел в файл, който се намира локално или някъде в отдалечено местоположение.

В следващия пример - ще разгледаме как да преведем Unip grep командите в Java.

4.1. Изграждане на конфигурация

Добавете следната зависимост от вашия pom.xml или build.gradle :

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Греп примери

Примерен 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.