Obter Substring de String em Java

Obter Substring de String em Java

1. Visão geral

Neste tutorial, descobriremos como obter uma substring deString em Java.

Usaremos principalmente os métodos da classeStringe alguns da classeStringUtils do Apache Commons.

Em todos os exemplos em que trabalharemos:

String text = "Julia Evans was born on 25-09-1984. "
  + "She is currently living in the USA (United States of America).";

2. Dependências do Maven

Para usar a classeStringUtils que faz parte da bibliotecaApache Commons Lang, precisamos adicionar a seguinte dependência no projeto Maven:


    org.apache.commons
    commons-lang3
    3.8

Você pode encontrar a versão mais recente desta bibliotecahere.

3. Usandosubstring

Esse é o método mais frequentemente usado para extrair uma substring. Você pode fornecer um índice inicial e um índice final opcional para extrair os caracteres intermediários.

Se não especificarmos o índice final, a substring estará em todo o caminho até o final deString.

Vamos considerar que queremos extrair o país de residência de Julia:

assertEquals("USA (United States of America).",
  text.substring(67));

Para se livrar do período no final da saída, podemos usar a versão ligeiramente modificada do mesmo método:

assertEquals("USA (United States of America)",
  text.substring(67, text.length() - 1));

Nos exemplos acima, usamos a posição exata para extrair a substring.

3.1. Obtendo uma substring começando em um caractere específico

Caso a posição precise ser calculada dinamicamente com base em um caractere ouString, podemos fazer uso do métodoindexOf:

assertEquals("United States of America",
  text.substring(text.indexOf('(') + 1, text.indexOf(')')));

Um método semelhante que pode nos ajudar a localizar nossa substring élastIndexOf. Vamos usarlastIndexOf para extrair o ano "1984". É a parte do texto entre o último traço e o primeiro ponto:

assertEquals("1984",
  text.substring(text.lastIndexOf('-') + 1, text.indexOf('.')));

TantoindexOfelastIndexOf podem ter um caractere ouString como parâmetro. Vamos extrair o texto “USA” e o restante do texto entre parênteses:

assertEquals("USA (United States of America)",
  text.substring(text.indexOf("USA"), text.indexOf(')') + 1));

4. UsandosubSequence

A classeString fornece outro método chamadosubSequence, que atua de forma semelhante ao métodosubstring.

A única diferença é que ele retornaCharSequence em vez deString e só pode ser usado com um índice inicial e final específico:

assertEquals("USA (United States of America)",
  text.subSequence(67, text.length() - 1));

5. Usando expressões regulares

Expressões regulares virão em nosso socorroif we have to extract a substring that matches a specific pattern.

No exemploString,, a data de nascimento de Julia está no formato “dd-mm-aaaa”. Podemos corresponder a esse padrão usando a API de expressão regular Java.

Primeiro de tudo, precisamos criar um padrão para "dd-mm-aaaa":

Pattern pattern = Pattern.compile("\\d{2}-\\d{2}-\\d{4}");

Então, vamos aplicar o padrão para encontrar uma correspondência no texto fornecido:

Matcher matcher = pattern.matcher(text);

Após a correspondência bem-sucedida, podemos extrair oString: correspondido

if (matcher.find()) {
    Assert.assertEquals("25-09-1984", matcher.group());
}

Para obter mais detalhes sobre as expressões regulares Java, confira o tutorialthis.

6. Usandosplit

Podemos usar o métodosplit da classeString para extrair uma substring. Digamos que queremos extrair a primeira frase do exemploString.. Isso é muito fácil de fazer usandosplit:

String[] sentences = text.split("\\.");

Como o método split aceita uma regex, tivemos que escapar do caractere de ponto. Agora, o resultado é uma matriz de 2 frases.

Podemos usar a primeira frase (ou iterar por toda a matriz):

assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);

Observe que existem maneiras melhores de detecção e tokenização de sentenças usando o Apache OpenNLP. Confira o tutorialthis para aprender mais sobre a API OpenNLP.

7. UsandoScanner

Geralmente usamosScanner para analisar tipos primitivos eStrings usando expressões regulares. A Scanner breaks its input into tokens using a delimiter pattern, que por padrão corresponde aos espaços em branco.

Vamos descobrir como usar isso para obter a primeira frase do texto de exemplo:

try (Scanner scanner = new Scanner(text)) {
    scanner.useDelimiter("\\.");
    assertEquals("Julia Evans was born on 25-09-1984", scanner.next());
}

No exemplo acima, definimos o exemploString como a fonte a ser usada pelo scanner.

Então, estamos definindo o caractere de ponto como delimitador (que precisa ser escapado, caso contrário, ele será tratado como o caractere especial de expressão regular nesse contexto).

Por fim, afirmamos o primeiro token dessa saída delimitada.

Se necessário, podemos iterar por meio da coleção completa de tokens usando um loopwhile.

while (scanner.hasNext()) {
   // do something with the tokens returned by scanner.next()
}

8. UsandoStringUtils

As bibliotecas do Apache Commons adicionam alguns métodos úteis para manipular os principais tipos de Java. Apache Commons Lang fornece um host de utilitários auxiliares para a API java.lang, mais notavelmente os métodos de manipulaçãoString.

Neste exemplo, veremoshow to extract a substring nested between two Strings:

assertEquals("United States of America",
  StringUtils.substringBetween(text, "(", ")"));

Há uma versão simplificada deste método no caso da substring estar aninhada entre duas instâncias do mesmoString:

substringBetween(String str, String tag)

O métodosubstringAfter da mesma classe obtém a substring após a primeira ocorrência de um separador.

O separador não é retornado:

assertEquals("the USA (United States of America).",
  StringUtils.substringAfter(text, "living in "));

Da mesma forma, o métodosubstringBefore obtém a substring antes da primeira ocorrência de um separador.

O separador não é retornado:

assertEquals("Julia Evans",
  StringUtils.substringBefore(text, " was born"));

Você pode verificar este tutorial para saber mais sobre o processamento deString usando a API Apache Commons Lang.

9. Conclusão

Neste artigo rápido, descobrimos várias maneiras de extrair uma substring deString em Java. Você pode explorar nossoother tutorials na manipulação deString em Java.

Como sempre, trechos de código podem ser encontradosover on GitHub.