Problemas com replaceAll

3 respostas
stringjava
N

Os replaces estão se acumulando e no final o resultado não é o desejado.
Exemplo:

string str "laranja goiaba banana";
str = str.replaceAll("laranja", "goiaba").replaceAll("goiaba", "banana").replaceAll("banana", "laranja");
System.out.print(str);

O resultado que eu queria obter era “goiaba banana laranja”, mas o que aparece é “laranja laranja laranja” porque eles se acumulam, como resolver?

3 Respostas

wldomiciano

Não é problema, é o comportamento esperado deste método.

  • Começa com: “laranja goiaba banana”
  • Substituindo laranja por goiaba fica: “goiaba goiaba banana”
  • Substituindo goiaba por banana fica: “banana banana banana”
  • Substituindo banana por laranja fica: “laranja laranja laranja

Pra fazer exatamente o que vc quer (tirar laranja do inicio e colocar no final) o código abaixo é o suficiente.

String str = "laranja goiaba banana";
str = str.replaceAll("(laranja)(.*)", "$2 $1");
System.out.println(str);

Se quiser algo mais robusto, terá que usar mais que uma simples String. Pensei numa outra possível solução, com certeza não é a melhor que já viu, mas fiz só pra oferecer uma alternativa:

String[] arr = "laranja goiaba banana".split(" ");

String temp = arr[0];

for (int i = 0, j = 1; j < arr.length; i++, j++)
    arr[i] = arr[j];

arr[ arr.length - 1 ] = temp;

System.out.println( String.join(" ", arr) );
N

Eu entendi, mas não era o esperado no meu caso. Estou tentando fazer um código que mude letras especificas para outras com cada letra indo 4 letras para frente:
ABCDE - EFGHI, mas no final isso vai como IFGHI
Uma espécie de replaceAll que funcione tudo de uma vez só, entende?

filipemarruda

Aqui… não sei se entendi muito bem… mas pra fazer essa alteração de letras vai ser mais simples (e performatico) trabalhar com o charcode que com regex.

Criado 24 de março de 2018
Ultima resposta 24 de mar. de 2018
Respostas 3
Participantes 3