Remover ou substituir parte de uma string em Java
1. Visão geral
Neste tutorial, veremos vários meios de remover ou substituir parte deString em Java.
Exploraremos a remoção e / ou substituição de uma substring usando uma APIString, depois usando uma APIStringBuilder e finalmente usando a classeStringUtils da biblioteca Apache Commons.
Como bônus,we’ll also look into replacing an exact word using the String API and the Apache Commons RegExUtils class.
2. APIString
Um dos métodos mais simples e diretos de substituir uma substring é usar oreplace, replaceAll orreplaceFirst de aString class.
O métodoreplace() leva dois argumentos - destino e texto de substituição:
String master = "Hello World example!";
String target = "example";
String replacement = "Java";
String processed = master.replace(target, replacement);
assertTrue(processed.contains(replacement));
assertFalse(processed.contains(target));
O snippet acima produzirá esta saída:
Hello World Java!
Se uma expressão regular for necessária na escolha do destino, entãoreplaceAll() oureplaceFirst() deve ser o método de escolha. Como o nome indica,replaceAll() de lavagem substituirá cada ocorrência correspondida, enquantoreplaceFirst() substituirá a primeira ocorrência correspondida:
String master2 = "Welcome to example, Hello World example";
String regexTarget = "(example)$";
String processed2 = master2.replaceAll(regexTarget, replacement);
assertTrue(processed2.endsWith("Java"));
O valor deprocessed2 será:
Welcome to example, Hello World Java
É porque a regex fornecida comoregexTarget corresponderá apenas à última ocorrência deexample. In all examples given above, we can use an empty replacement and it’ll effectively remove a target from a master.
3. APIStringBuilder
Também podemos manipular texto em Java usando a classeStringBuilder. . Os dois métodos aqui sãodelete()ereplace().
Podemos construir uma instância deStringBuilder a partir deString existente e, em seguida, usar os métodos mencionados para realizar a manipulação deString conforme desejado:
String master = "Hello World example!";
String target = "example";
String replacement = "Java";
int startIndex = master.indexOf(target);
int stopIndex = startIndex + target.length();
StringBuilder builder = new StringBuilder(master);
Agora podemos remover otarget com odelete():
builder.delete(startIndex, stopIndex);
assertFalse(builder.toString().contains(target));
Também podemos usarreplace() para atualizar o mestre:
builder.replace(startIndex, stopIndex, replacement);
assertTrue(builder.toString().contains(replacement));
Uma diferença aparente entre usarStringBuilder e a APIString é que temos que obter o índice inicial e final detargetString nós mesmos.
4. StringUtils classe
Outro método que consideraremos é a biblioteca Apache Commons.
Primeiro, vamos adicionar a dependência necessária ao nosso projeto:
org.apache.commons
commons-lang3
3.8.1
A última versão da biblioteca pode ser encontradahere.
O sclassStringUtils tem métodos para substituir uma substring de umString:
String master = "Hello World example!";
String target = "example";
String replacement = "Java";
String processed = StringUtils.replace(master, target, replacement);
assertTrue(processed.contains(replacement));
Há uma variante sobrecarregada dereplace() que leva um parâmetromax inteiro, que determina o número de ocorrências a serem substituídas. We can also use the replaceIgnoreCase() if case-sensitivity is not a concern:
String master2 = "Hello World example!";
String target2 = "example";
String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement);
assertFalse(processed2.contains(target));
5. Substituindo Palavras Exatas
Neste último exemplo,we’ll learn how to replace an exact word inside a String.
A maneira direta de realizar essa substituição éusing a regular expression com limites de palavras.
The word boundary regular expression is . Incluir a palavra desejada dentro dessa expressão regular corresponderá apenas às ocorrências exatas.
Primeiro, vamos ver como usar essa expressão regular com a API String:
String sentence = "A car is not the same as a carriage, and some planes can carry cars inside them!";
String regexTarget = "\\bcar\\b";
String exactWordReplaced = sentence.replaceAll(regexTarget, "truck");
A stringexactWordReplaced contém:
"A truck is not the same as a carriage, and some planes can carry cars inside them!"
Only the exact word will be replaced. Observebackward slash always needs to be escaped ao trabalhar com expressões regulares em Java.
Uma maneira alternativa de fazer essa substituição é usar a classeRegExUtils da Apache Commons Library, que pode ser adicionada como uma dependência, como vimos na seção anterior:
String regexTarget = "\\bcar\\b";
String exactWordReplaced = RegExUtils.replaceAll(sentence, regexTarget, "truck");
Embora ambos os métodos produzam o mesmo resultado, a decisão de qual deles deve ser usado dependerá do nosso cenário específico.
6. Conclusão
Em conclusão, exploramos mais de uma maneira de remover e substituir uma substring em Java. O melhor método para aplicar ainda depende em grande parte da situação e do contexto atual.
Como de costume, o código-fonte completo está disponívelover on Github.