Curiosidade: Trocar \ por \\

Tentando resolver uma dpuvida de outro usuário, acabei ficando com uma curiosidade.

Se tenho uma string que tem o caracter \ e quero trocar esse \ por \ (duas barras), como faço?

Por tentativa e erro, cheguei ao resultado:

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

Alguém pode me explicar o porquê de tantas barras para poder dar certo?
E existe outra forma mais simples e mais elegante de fazer isso? Talvez com expressões regulares?
Ficou muito feio desse jeito. :slight_smile:

Caso vc use somente uma barra o compilador pensa que o proximo caracter se trata de uma sequencia de escape como: “\n” ou “\t”.

Use o replace:

linha = linha.replace("\","\\");  

É muito menos barra, mas ainda é barra pra caramba.

Como o colega explicou existem os caracteres de escape. E quem define esses caracteres é a .
Para inserir uma quebra de linha, usa-se \n. Agora, e se você quisesse realmente escrever \n e não pular uma linha?
A solução encontrada para isso foi colocar duas barras juntas, quando se quer escrever efetivamente a .

//A string abaixo fica com o valor "\n é usado para pular uma linha" String explic = "\n é usado para pular uma linha";

Acontece que o replaceAll usa expressões regulares. E elas são escritas em strings. Na verdade, as expressões regulares pioram o seu problema, pois elas usaram a mesma técnica. Para escrever um \ numa expressão regular, também é necessário usar \ dentro do valor da string. Agora, como o Java também considera o caracter de escape , para criar uma expressão regular contendo o valor “\” (significando uma única barra) vc terá que escrever a string “\\”.

O comando replace já troca caracteres sem usar expressão regular, por isso, você pode usar no java apenas \ (valor “”) e substuir por \\ (valor “\”).

Espero que tenha dado para entender.