Expressão regular e replaceAll

Dei uma olhada aqui no GUJ e não achei nada! Então aqui vai:

Fiz o programa abaixo, bem simples

public static void main(String[] args) {
	String replace = "Substituir \" por \\"";
	System.out.println(replace);
	replace = replace.replaceAll("\"", "\\"");
	System.out.println(replace);
	replace = replace.replace("\"", "\\"");
	System.out.println(replace);
}

Rodei e a saída foi:
//----------------------------
Substituir " por "
Substituir " por "
Substituir " por \"
//----------------------------

Minha dúvida é a seguinte: Por que o método replace funciona, mas o replaceAll não funciona na substituição de " por "???

Obrigado,

nao entendi muito,agora c vc quizer q saia uma string => \ ,tem q colocar assim =>\ ,para cada 2 barras significa uma!!!,pos na hora de execucao a MV olha aquela string e ve q tem uma barra e ve o q vem depois por exemplo c for \n e quebra de linha, tem vairos ,nao sei c matei sua duvida?

replaceAll requer uma expressão regular. O problema é que “” é um caracter especial para expressões regulares. Se você quiser usá-lo em uma expressão regular para representar o próprio “”, deve duplicá-lo:
“\” (se for uma string no programa Java, você sabe que tem de duplicar o duplicado, e então tem de usar “\\”)

Nenhum dos dois respondeu, sinto muito ^^. Olhando o código não deve ficar tão dificil matar minha duvida…
Vamos la:

tenho a string Substituir " por \"
no console ela fica assim: Substituir " por "

A frase ja diz minha intenção, quero substituir qualquer ocorrencia de " por “, então eu tento usar o replaceAll(”","\""), mas ele não funciona e, usando o replace(""","\"") da mesma maneira, funciona. A diferença é que o replaceAll usa String e o replace usa CharSequence.

Eu sei que “” na string é “\” e que " é "… Mas quero saber porque o método replace substitui corretamente e o replaceAll, não!
Deu pra entender?

Diz o Javadoc. Ou seja o replace substitui CADA substring dessa string que é equivalente com a string passada no target, enquanto que o replaceAll usa uma expressão regular e não uma String.

Simplificando no replace se você colocar “a+”. Ele vai substituir toda ocorrêcia da String “a+”, usando replaceAll ele vai avaliar isso como uma expressão regular e vai substitiur tudo que comçear com a e tiver mais de 1 caracter após o a.
Entendeu a diferença?

Agora deu pra entender melhor! Mas me explica uma coisa então! Pra que são usadas as aspas " em expressão regular? Achei que eram interpretadas como string literal mesmo, assim como quando se poe um a, por exemplo, e que colocar “”*" seria 0 ou mais ocorrencias de aspas…

Somente reavivando um tópico, pois ninguem respondeu minha duvida acima ^^

Guilherme Gomes, fiquei curioso pela resposta deste comportamento. Aparentemente era para funcionar exatamente como você descreveu acima.

Eu ja entendi, a diferença entre o replaceAll e o replace é que um usa String com expressão regular e o outro usa CharSequence, fazendo a substituição literal…

Entendeu?

Certo, entendi que um usa expressão regular e o outro não, mas realmente faz sentido que ao procurar por " como expressão regular substituindo por \", o comando deveria ter feito o que você comentou. Ou será que eu me confundi todo e não estou raciocinando corretamente? oO’

Afinal, qual seria a forma correta para se trocar " por " usando replaceAll? :smiley:

[code]public class Teste {

public static void main(String[] args) {
	String replace = "Substituir \" por \\"";
	System.out.println(replace);
	//Imprime - Substituir " por \"
	//Substituir todos " por \"
	replace = replace.replaceAll("[\"]", "\\\"");
	System.out.println(replace);
	//Imprime - Substituir \" por \"
	//Substituir primeira " por \"
	replace = replace.replace("\"", "\\"");
	System.out.println(replace);
	//Imprime - Substituir \" por \\"
}

}[/code]

Sugiro que voce veja algo sobre regex

www.regular-expressions.info
java.sun.com/docs/books/tutorial/essential/regex
http://www.google.com.br/search?hl=pt-BR&q=tutorial+regex+%2B+java&meta=

Elas são interpretadas com " porque precisam ser passadas de alguma forma e a melhor forma de você passar uma expres~são regular é com String, até porque o relacionamento regex/string é muito intimo.
Espero te ajudado.

Alguem sabe pq da erro no seguinte?

String linha = "&especie";
linha = linha.replaceAll("&especie", "R$");

da o seguinte erro:

String index out of range: 2

Vlw

[]'s

No caso de replaceAll, você deve prestar atenção ao segundo parâmetro. No segundo parâmetro, o caracter $ tem um significado especial, e normalmente é seguido por um dígito. Ele serve para ser substituído por um dos grupos que bateram com o primeiro parâmetro.

No seu caso (em que você simplesmente queria trocar pelo símbolo de real), você deve usar um “\” antes do $. Ou seja,

linha = linha.replaceAll("&especie", "R\$");