Introdução ao Apache Commons Text

Introdução ao Apache Commons Text

1. Visão geral

Simplificando, a biblioteca Apache Commons Text contém vários métodos utilitários úteis para trabalhar comStrings, além do que o Java principal oferece.

Nesta introdução rápida, veremos o que é o texto Apache Commons e para que ele é usado, bem como alguns exemplos práticos de uso da biblioteca.

2. Dependência do Maven

Vamos começar adicionando a seguinte dependência Maven ao nossopom.xml:


    org.apache.commons
    commons-text
    1.1

Você pode encontrar a versão mais recente da biblioteca emMaven Central Repository.

3. Visão geral

O pacote raizorg.apache.commons.text é dividido em diferentes subpacotes:

  • org.apache.commons.text.diff - diferenças entreStrings

  • org.apache.commons.text.similarity - semelhanças e distâncias entreStrings

  • org.apache.commons.text.translate - traduzindo texto

Vamos ver para que cada pacote pode ser usado - com mais detalhes.

3. Tratamento de Texto

O pacoteorg.apache.commons.text contém várias ferramentas para trabalhar comStrings.

Por exemplo,WordUtils tem APIs capazes de colocar em maiúscula a primeira letra de cada palavra em umString, trocando o caso de aString,e checando se aString contém todas as palavras em um dada matriz.

Vamos ver como podemos colocar a primeira letra de cada palavra em maiúscula em umString:

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

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

Aqui está como podemos verificar se uma string contém todas as palavras em uma matriz:

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

    assertTrue(containsWords);
}

StrSubstitutor fornece uma maneira conveniente de construirStrings a partir de modelos:

@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 é uma alternativa paraJava.lang.StringBuilder. Ele fornece alguns recursos novos que não são fornecidos porStringBuilder.

Por exemplo, podemos substituir todas as ocorrências de aString em outroString ou limpar aString sem atribuir um novo objeto à sua referência.

Aqui está um exemplo rápido para substituir parte de umString:

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

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

Para limpar umString,, podemos simplesmente fazer isso chamando o métodoclear() no construtor:

strBuilder.clear();

4. Calculando a diferença entreStrings

O pacoteorg.apache.commons.text.diff implementa o algoritmo de Myers para calcular diferenças entre doisStrings.

A diferença entre doisStrings é definida por uma sequência de modificações que pode converter umString em outro.

Existem três tipos de comandos que podem ser usados ​​para converter umString em outro -InsertCommand,KeepCommand eDeleteCommand.

Um objetoEditScript contém o script que deve ser executado para converter umString em outro. Vamos calcular o número de modificações de um único caractere que devem ser feitas para converter umString em outro:

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

    assertEquals(4, mod);
}

5. Semelhanças e distâncias entreStrings

O pacoteorg.apache.commons.text.similarity contém algoritmos úteis para encontrar semelhanças e distâncias entreStrings.

Por exemplo,LongestCommonSubsequence pode ser usado para encontrar o número de caracteres comuns em doisStrings:

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

    assertEquals(5, countLcs);
}

Da mesma forma,LongestCommonSubsequenceDistance pode ser usado para encontrar o número de caracteres diferentes em doisStrings:

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

    assertEquals(11, countLcsd);
}

6. Tradução do texto

O pacoteorg.apache.text.translate foi inicialmente criado para nos permitir personalizar as regras fornecidas porStringEscapeUtils.

O pacote possui um conjunto de classes responsáveis ​​pela conversão de texto em alguns dos diferentes modelos de codificação de caracteres, como Unicode e Numeric Character Reference. Também podemos criar nossas próprias rotinas personalizadas para tradução.

Vamos ver como podemos converter aString em seu texto Unicode equivalente:

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

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

Aqui, estamos passando o índice do caractere do qual queremos iniciar a tradução para o métodoabove().

LookupTranslator nos permite definir nossa própria tabela de pesquisa onde cada caractere pode ter um valor correspondente, e podemos traduzir qualquer texto para seu equivalente correspondente.

7. Conclusão

Neste tutorial rápido, vimos uma visão geral do que é o Texto do Apache Commons e alguns de seus recursos comuns.

As amostras de código podem ser encontradasover on GitHub.