Введение в Apache Commons Text

Введение в Apache Commons Text

1. обзор

Проще говоря, библиотека Apache Commons Text содержит ряд полезных служебных методов для работы сStrings, помимо того, что предлагает ядро ​​Java.

В этом кратком введении мы увидим, что такое Apache Commons Text и для чего он используется, а также несколько практических примеров использования библиотеки.

2. Maven Dependency

Начнем с добавления следующей зависимости Maven к нашемуpom.xml:


    org.apache.commons
    commons-text
    1.1

Вы можете найти последнюю версию библиотеки наMaven Central Repository.

3. обзор

Корневой пакетorg.apache.commons.text разделен на различные подпакеты:

  • org.apache.commons.text.diff - разница междуStrings

  • org.apache.commons.text.similarity - сходства и расстояния междуStrings

  • org.apache.commons.text.translate - перевод текста

Давайте посмотрим, для чего можно использовать каждый пакет - более подробно.

3. Обработка текста

Пакетorg.apache.commons.text содержит несколько инструментов для работы сStrings.

Например,WordUtils имеет API, способные использовать первую букву каждого слова вString,, заменяя регистрString, и проверяя, содержит лиString все слова в данный массив.

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

@Test
public void whenCapitalized_thenCorrect() {
    String toBeCapitalized = "to be capitalized!";
    String result = WordUtils.capitalize(toBeCapitalized);

    assertEquals("To Be Capitalized!", result);
}

Вот как мы можем проверить, содержит ли строка все слова в массиве:

@Test
public void whenContainsWords_thenCorrect() {
    boolean containsWords = WordUtils
      .containsAllWords("String to search", "to", "search");

    assertTrue(containsWords);
}

StrSubstitutor предоставляет удобный способ построенияStrings из шаблонов:

@Test
public void whenSubstituted_thenCorrect() {
    Map substitutes = new HashMap<>();
    substitutes.put("name", "John");
    substitutes.put("college", "University of Stanford");
    String templateString = "My name is ${name} and I am a student at the ${college}.";
    StrSubstitutor sub = new StrSubstitutor(substitutes);
    String result = sub.replace(templateString);

    assertEquals("My name is John and I am a student at the University of Stanford.", result);
}

StrBuilder является альтернативойJava.lang.StringBuilder. Он предоставляет некоторые новые функции, которых нет вStringBuilder.

Например, мы можем заменить все вхожденияString в другойString или очиститьString, не назначая новый объект его ссылке.

Вот быстрый пример замены частиString:

@Test
public void whenReplaced_thenCorrect() {
    StrBuilder strBuilder = new StrBuilder("example StrBuilder!");
    strBuilder.replaceAll("example", "new");

    assertEquals(new StrBuilder("new StrBuilder!"), strBuilder);
}

Чтобы очиститьString,, мы можем просто сделать это, вызвав методclear() в построителе:

strBuilder.clear();

4. Расчет разницы междуStrings

Пакетorg.apache.commons.text.diff реализует алгоритм Майерса для вычисления различий между двумяStrings.

Разница между двумяStrings определяется последовательностью модификаций, которые могут преобразовать одинString в другой.

Есть три типа команд, которые можно использовать для преобразования одногоString в другой -InsertCommand,KeepCommand иDeleteCommand.

ОбъектEditScript содержит сценарий, который должен быть запущен, чтобы преобразоватьString в другой. Давайте посчитаем количество модификаций с одним символом, которые необходимо сделать, чтобы преобразоватьString в другой:

@Test
public void whenEditScript_thenCorrect() {
    StringsComparator cmp = new StringsComparator("ABCFGH", "BCDEFG");
    EditScript script = cmp.getScript();
    int mod = script.getModifications();

    assertEquals(4, mod);
}

5. Сходства и расстояния междуStrings

Пакетorg.apache.commons.text.similarity содержит алгоритмы, полезные для поиска сходств и расстояний междуStrings.

Например,LongestCommonSubsequence можно использовать, чтобы найти количество общих символов в двухStrings:

@Test
public void whenCompare_thenCorrect() {
    LongestCommonSubsequence lcs = new LongestCommonSubsequence();
    int countLcs = lcs.apply("New York", "New Hampshire");

    assertEquals(5, countLcs);
}

Точно так жеLongestCommonSubsequenceDistance можно использовать для определения количества разных символов в двухStrings:

@Test
public void whenCalculateDistance_thenCorrect() {
    LongestCommonSubsequenceDistance lcsd = new LongestCommonSubsequenceDistance();
    int countLcsd = lcsd.apply("New York", "New Hampshire");

    assertEquals(11, countLcsd);
}

6. Перевод текста

Пакетorg.apache.text.translate изначально был создан, чтобы позволить нам настраивать правила, предоставляемыеStringEscapeUtils.

Пакет имеет набор классов, которые отвечают за перевод текста в некоторые из различных моделей кодирования символов, таких как Unicode и Numeric Character Reference. Мы также можем создавать собственные программы для перевода.

Давайте посмотрим, как мы можем преобразоватьString в эквивалентный текст в Юникоде:

@Test
public void whenTranslate_thenCorrect() {
    UnicodeEscaper ue = UnicodeEscaper.above(0);
    String result = ue.translate("ABCD");

    assertEquals("\\u0041\\u0042\\u0043\\u0044", result);
}

Здесь мы передаем индекс символа, с которого хотим начать перевод, методуabove().

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

7. Заключение

В этом кратком руководстве мы увидели обзор того, что такое Apache Commons Text, и некоторые из его общих функций.

Примеры кода можно найтиover on GitHub.