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

W

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?

F

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