Problema com replaceAll com $

10 respostas
B

Caros,

Estou com um sério problema e não sei como resolver
:sad:

É o seguinte:

String Valor = "R$ 50,64"; //Vem do Banco
String MsgEmail = "Valor do Produto: [VALOR_PRODUTO]";
MsgEmail = MsgEmail.replaceAll("\\[VALORPRODUTO]", Valor);

Qdo tento executar a rotina acima, ocorre um erro por causa do cifrão (Illegal group reference).
Alguém tem alguma luz?

10 Respostas

E

eae blz?

cara o problema naum tah acontecendo por causa da string do valor
que tem o R$, vc jah tentou executar sem essa parte da string soh pra testar

bom caso vc precise dessa parte na string vc pode fazer o seguinte retirar essa parte inicial do string realizar a operação e depois reconcatenar com esse parte de string R$

tenta isso, qq coisa fala ai :wink:

[]'s

B

Já fiz o teste sim. Tirando o $ funciona legal.
O problema de remover essa parte da string e depois concatenar, é que tenho um texto muito grande (o “R$ 50,64” foi só um exemplo)
Na verdade eu tenho um Texto com descrição e preço de vários produtos.

E

cara eu tava testando o seu codigo tipo

olha oq aconteceu todas as letras que tinha dentro dos caracteres
que vc mandou trocar ele troca todas as letras pelo valor que vc mandou

em alguns casos ficou em loop infinito aki 8O
e com isso disparou erro no Matcher

ainda to procurando uma solução…

[]'s

E

ae ae ae ae

pronto tah ai uma função de replace de qq string para o seu texto
100% redondinho e operecional :wink:

segue o código e esse eu aguarantio :razz:

String Valor = "R$ 50,64"; //Vem do Banco
        String msgEmail = "[VALOR_PRODUTO] Valor do Produto: [VALOR_PRODUTO] qualquer coisa custa mais [VALOR_PRODUTO]"; 
        
        String troca = "[VALOR_PRODUTO]";
        int trocaLength = troca.length();
        
        String msgEmailAtualizado = "";
        for( int i = 0; i < msgEmail.length(); i++ ) {
            String temp = msgEmail.substring(i, i+trocaLength);
            if( temp.equals( troca ) ) {
                msgEmailAtualizado += Valor;
                i = i + ( trocaLength-1 );
            } else {
                msgEmailAtualizado += "" + msgEmail.charAt(i);
            }
        }        
        System.out.println( msgEmailAtualizado );
        msgEmail = msgEmailAtualizado;

bom qq coisa é soh falar q a equipe PJ de plantão ajuda como pode :wink:

[]'s

B

Faaaala…

Então…
Eu já tinha pensado em fazer algo assim, mas é que achei meio “bichado” ter que fazer uma função, e buscar em todo o texto o que quero substituir.

Tecnicamente o replace teria q dar conta
8O

E

bom tecnicamente é uma coisa
mas na pratica é outra

eu tambem tentei usar o replace normal
mas naum funcionava direito então resolvi
ler o codigo fonte da classe String
e vi que o replace não muda palavras inteiras
mas apenas os caracteres que vc indica, cada caractere
ele substitui por um outro caractere

com isso dependendo da forma que vc montar o seu replace
ele fica em um laço infinito de susbtituição de caractere

e consequencia gera erro…

ps.: se vc for ver como são os codigos que realizam
o find replace em strings, vc vai notar que não é muito diferente desse
codigo que eu mandei ai :???:

ps.: uma dica de algo que eu faço, sempre que eu estou com duvida quanto ao funcionamento de algo em java eu leio o fonte da classe para
entender oq a classe pode fazer e como ela processa oq eu quero

[]´s

D

Tecnicamente não. O replaceAll funciona sim. Soh q ele utiliza “Expressões regulares”(ou regular expression se preferir, regex). A classe responsável por isso é a java.util.regex.Pattern. O que acontece eh o seguinte: essa classe entende que o $ é o final de uma linha. Então por exemplo se vc quer trocar $ por A, ele entende que A ira ficar no lugar do \n. Entendeu? A melhor coisa que vc faz eh entrar aki http://java.sun.com/j2se/1.5.0/docs/api/index.html e dar uma olhada na documentacao… de inicio vc ficara um pouco confuso… mas dpois vc vai descobrir que isto eh mto util… espero ter ajudado… flws

D

“AnjoSupremo”:
bom tecnicamente é uma coisa
mas na pratica é outra

eu tambem tentei usar o replace normal
mas naum funcionava direito então resolvi
ler o codigo fonte da classe String
e vi que o replace não muda palavras inteiras
mas apenas os caracteres que vc indica, cada caractere
ele substitui por um outro caractere

com isso dependendo da forma que vc montar o seu replace
ele fica em um laço infinito de susbtituição de caractere

e consequencia gera erro…

ps.: se vc for ver como são os codigos que realizam
o find replace em strings, vc vai notar que não é muito diferente desse
codigo que eu mandei ai :???:

ps.: uma dica de algo que eu faço, sempre que eu estou com duvida quanto ao funcionamento de algo em java eu leio o fonte da classe para
entender oq a classe pode fazer e como ela processa oq eu quero

[]´s

Antes de olhar o codigo fonte de uma olhada na documentacao… eh mais rapido e pode ser util! :grin:

A

Eu resolvi com este método, depois faço o replace que quiser com o texto tratado.

public static String tratarSifraoTextoReplace(String texto){
        
        String textoResp = texto;
        
        for (int i = 0; i < texto.length(); i++) {
            
            char c = texto.charAt(i);
            
            if( c == '$' ){
                textoResp = textoResp.substring(0,i) + "\\$" + textoResp.substring(i + 1);
            }
            
        }
        
        return textoResp;
    }
R

Caramba, reviveu um tópico de quase 10 anos atrás :slight_smile:

Criado 28 de maio de 2005
Ultima resposta 5 de jan. de 2015
Respostas 10
Participantes 5