HOWTO · Java
Como substituir vários caracteres numa string em Java
Saiba quando utilizar String.replaceAll(), String.replace() ou String.replaceFirst() para substituir vários caracteres numa string em Java.
Nesta página
Em Java, utilize String.replaceAll() com uma classe de caracteres de expressão regular para substituir vários caracteres selecionados ao longo de uma string. Para substituições literais que não precisam de um padrão, encadeie chamadas a String.replace(). Escolha String.replaceFirst() quando pretender alterar apenas a primeira correspondência da expressão regular.
Substituir vários caracteres numa string utilizando replaceAll() em Java
String.replaceAll(regex, replacement) interpreta o primeiro argumento como uma expressão regular e substitui todas as correspondências. Uma classe de caracteres como [_/] corresponde a um sublinhado ou a uma barra oblíqua, um de cada vez. Não corresponde ao par de caracteres _/ como uma sequência.
Este programa completo substitui sublinhados e barras oblíquas por hífenes e, em seguida, apresenta as duas strings:
public class ReplaceAllChars {
public static void main(String[] args) {
String input = "j_u_s_t/a/s/t/r/i/n/g";
String result = input.replaceAll("[_/]", "-");
System.out.println("Input: " + input);
System.out.println("Result: " + result);
}
}
Input: j_u_s_t/a/s/t/r/i/n/g
Result: j-u-s-t-a-s-t-r-i-n-g
No código Java, a barra invertida da expressão regular também tem de ser escapada no literal da string. Por exemplo, "\\d" fornece a expressão regular \d, que corresponde a um algarismo. Substituir uma correspondência por "" remove-a. Por exemplo, "abcd12345efgh".replaceAll("\\d", "") remove algarismos, "s t r i n g".replaceAll(" ", "") remove espaços comuns e "s t\\tr".replaceAll("\\s", "-") substitui espaços em branco reconhecidos pela expressão regular, incluindo espaços e tabulações, por hífenes.
Estas expressões removem algarismos, removem espaços comuns e substituem espaços em branco reconhecidos pela expressão regular (incluindo espaços e tabulações) por hífenes. Para remover especificamente letras minúsculas ASCII, utilize [a-z]. Por predefinição, Java trata \p{Lower} como ASCII; esta classe inclui caracteres minúsculos Unicode apenas quando o comportamento de classes de caracteres Unicode está ativado.
Substituir múltiplos caracteres numa string utilizando String.replace() em Java
String.replace(target, replacement) procura uma sequência literal de caracteres, não uma expressão regular. Cada chamada substitui todas as ocorrências do alvo e devolve uma nova string; as strings em Java são imutáveis. Encadear chamadas é útil quando cada alvo tem o seu próprio mapeamento. As chamadas são executadas da esquerda para a direita, pelo que uma substituição anterior pode criar texto que será encontrado por uma chamada posterior.
Por exemplo, partindo de "javbjavcjadakavajavc", a cadeia input.replace("b", "a").replace("c", "a").replace("d", "v").replace("k", "j") produz javajavajavajavajava. Escolha replace() quando os alvos são sequências literais e for mais claro fazer cada substituição numa chamada separada; utilize replaceAll() quando uma expressão regular puder descrever em conjunto os caracteres a alterar.
Substituir vários caracteres numa string utilizando String.replaceFirst() em Java
String.replaceFirst(regex, replacement) também recebe uma expressão regular, mas altera apenas a primeira correspondência por chamada. Repetir a chamada inicia a pesquisa seguinte na string devolvida pela chamada anterior. Isto pode ser útil quando o número e a ordem das alterações são intencionais.
Por exemplo, "This is a sample string.".replaceFirst("i", "1").replaceFirst("s", "2") devolve Th12 is a sample string.. A primeira chamada altera o i de This; a segunda procura então o primeiro s na string atualizada, que é o s de This. Utilize replaceFirst() quando precisar de alterar apenas a primeira correspondência; utilize replaceAll() quando quiser alterar todas as correspondências.
Conclusão
Para alterar vários caracteres selecionados, utilize uma classe de caracteres de expressão regular com String.replaceAll() para substituir todas as correspondências. Encadeie chamadas a String.replace() para substituições literais e escolha String.replaceFirst() quando cada chamada dever afetar apenas a primeira correspondência da expressão regular.