Problemas com replaceAll

7 respostas
andre_a_s

Senhores… devo estar com problemas de alcool na cabeça…
Estou fazendo o seguinte:

string = string.replaceAll(".", "");

Antes de executar a minha string está com o valor de “2.290,00”
Após a execução da linha, minha string está como valor: “”

Como é possivel?
Se eu mudar de replaceAll para replace ele funciona… mas eu não consigo entender o porque.
Ele simplesmente apaga minha string.

*Se o replaceAll for com qualquer coisa que não seja “ponto final” ele funciona.
To doido mesmo?

7 Respostas

jgbt

vc tem que usar:

string.replaceAll("\.", "");

da uma lida sobre expressão regular se vc quiser saber o pq… heheh

[]'s

T

O primeiro parâmetro de replaceAll é uma expressão regular, não uma string constante.
Se você estudou expressões regulares direitinho, vai saber que “.” é uma expressão
regular que bate com qualquer caracter (não só o ponto), e é por isso que
a sua string “sumiu”.
Você pode fazer uma de duas coisas:

  • Pôr um “\” na frente do “.”, para indicar que o ponto é um mísero ponto, não
    uma expressão regular super-poderosa;
string = string.replaceAll("\.", "");
  • Ou então, já que você quer chutar o pau da barraca, usar Pattern.quote para
    “neutralizar” a expressão regular e torná-la uma simples string constante:
string = string.replaceAll(Pattern.quote ("."), "");

Note que “Pattern.quote” não está disponível no Java 5.0 se não me engano.

evandroshx

Cara, é meio louco mas tente o seguinte:

string = string.replaceAll("\.", "");

Na verdade, dessa forma vc está indicando que o ponto deve ser tratado com um caracter. O Java causa alguns problemas com alguns tipos de caracteres como ponto (.) e barras ( / \ ).

[]s

andre_a_s

Valeu pessoal.
Thingol, valeu pela explicação detalhada. Expressão regular é uma coisa que a muito tempo eu to enrolando pra estudar… hahaha.
Usei o Pattern.quote mesmo, to usando Java 6.0

T

Eu acho que o pessoal da Sun, como sempre, andou “comendo bola” na definição de “replaceAll”. Eles deveriam ter feito o seguinte:

// caso mais comum e bobo
public String replaceAll (String stringFixa, String stringSubstituicao); 
// caso mais poderoso, mas menos comum
public String replaceAll (Pattern padrao, String stringSubstituicao);

(Note que as linguagens que têm suporte a expressões regulares, como Perl e JavaScript, usam algo específico, como “/”, para indicar que a string é uma expressão regular. Por exemplo, teríamos algo como replaceAll (/./, “”) ).

E se você realmente quisesse uma expressão regular (que é o caso menos freqüente), usaria:

string = string.replaceAll (Pattern.compile ("."), "");
dahenz

Neste caso… como eu faria???

query.replace("#acumAndClauses#", "and 1=1");

Obrigado!!

T

Como você deve ter aprendido, String é um tipo imutável, mas as variáveis de referência para Strings não são imutáveis (a menos que denotadas com “final”). Supondo que “query” seja uma variável String:

String query = "select anfotero from enantiomeros #acumAndClauses#";

você pode fazer a substituição assim:

query = query.replace ("#acumAndClauses#", "and 1=1"); // Java 5.0 ou posterior

ou então

query = query.replaceAll ("#acumAndClauses#", "and 1=1"); // Java 1.4 ou posterior

Como “#” não é um caracter especial para expressões regulares não há problema em usá-lo diretamente.

Criado 13 de junho de 2007
Ultima resposta 13 de fev. de 2009
Respostas 7
Participantes 5