Remplacement de doubles barres obliques inverses avec une seule barre oblique inverse
J'ai une chaîne de caractères "\\u003c", qui appartient à l'UTF-8 jeu de caractères. Je suis incapable de décoder en unicode en raison de la présence de la double anti-slash. Comment puis-je obtenir "\u003c" à partir de "\\u003c"? Je suis à l'aide de java.
J'ai essayé avec,
myString.replace("\\\\", "\\");
mais ne pouvait pas obtenir ce que je voulais.
C'est mon code,
String myString = FileUtils.readFileToString(file);
String a = myString.replace("\\\\", "\\");
byte[] utf8 = a.getBytes();
//Convert from UTF-8 to Unicode
a = new String(utf8, "UTF-8");
System.out.println("Converted string is:"+a);
et le contenu du fichier est
\u003c
Pouvez-vous poster le code que vous utilisez pour décoder la chaîne?
OriginalL'auteur Vinay thallam | 2012-06-13
Vous devez vous connecter pour publier un commentaire.
Ne sais pas si vous êtes toujours à la recherche d'une solution à votre problème (puisque vous avez accepté la réponse) mais je vais quand même ajouter ma réponse comme une solution possible à la problème énoncé:
De SORTIE:
Voici une démonstration en ligne du code ci-dessus
La question demeure: pourquoi la double backslahes il y a dans la Chaîne en premier lieu?
Salut. Je suis sûr que bouble backslahes sont là dans myString. Quand j'assigne "\u003c" myString dans mon code source, et bientôt après l'imprimer pour la console elle donne "<".Mais si je lis même "\u003c" de certains fichiers et d'assigner à myString et ne à la console,il imprime \u003c. Ma conjecture est que FileUtils de l'API est de s'échapper de la barre oblique inverse lors de la lecture du fichier.
OriginalL'auteur anubhava
Vous pouvez utiliser
String#replaceAll
:Il semble bizarre, parce que le premier argument est une chaîne de caractères de la définition d'une expression régulière, et
\
est un caractère spécial à la fois dans les littéraux de chaîne et dans les expressions régulières. Pour mettre un\
dans notre chaîne de recherche, nous avons besoin de l'échapper (\\
) dans le littéral. Mais pour mettre un\
dans le expression régulière, nous devons échapper à l'expression régulière niveau ainsi. Donc, pour obtenir littéralement\\
dans une chaîne de caractères, nous avons besoin d'écrire\\\\
dans la chaîne de caractères littérale; et obtenir deux littérale\\
pour le moteur d'expression régulière, nous avons besoin de sortir de ceux aussi bien, de sorte que nous nous retrouvons avec\\\\\\\\
. Qui est:Dans le paramètre de remplacement, même si elle n'est pas une regex, il traite toujours
\
et$
spécialement — et si nous avons à leur échapper dans le remplacement. Donc, pour obtenir une barre oblique inverse dans le remplacement, nous avons besoin de quatre dans la chaîne de caractères littérale.Vous devriez poster une
replace
réponse. Comme vous l'avez dit sur mon désormais supprimé réponse,replaceAll
est juste le mauvais outil si votre objectif est de remplacer\\
avec\
.il m'a fallu un certain temps, mais finalement j'ai posté un
replace
réponse!C'est ma meilleure réponse que je n'ai pas vraiment écrire! Le crédit va à @T. J. Crowder!
Juste à chair un peu. 😉 J'aime quand l'aspect collaboratif des œuvres.
OriginalL'auteur mtyson
Une autre option, la capture de l'un des deux barres obliques et remplacer les deux barres obliques avec le groupe capturé:
OriginalL'auteur podnov
Concernant le problème de "remplacement de doubles barres obliques inverses par des barres obliques inverses unique" ou, plus généralement, "remplacement d'une simple chaîne de caractères, contenant
\
, avec un simple chaîne de caractères, contenant\
" (qui n'est pas entièrement de l'OP problème, mais une partie de celui-ci):La plupart des réponses dans ce fil mention
replaceAll
, qui est un mauvais outil pour le travail ici. Le plus facile de l'outil estreplace
, mais point de prêter à confusion, les OP membres quireplace("\\\\", "\\")
ne fonctionne pas pour lui, c'est peut-être pourquoi toutes les réponses se concentrent surreplaceAll
.Remarque importante pour les personnes avec le JavaScript fond:
Noter que
remplacer(CharSequence, CharSequence)
en Java ne remplace TOUTES les occurrences d'une sous-chaîne - contrairement à JavaScript, où il remplace seulement le premier!D'autre part,
replaceAll(String regex, Chaîne de remplacement)
-- plus de docs ici aussi - est de traiter les deux paramètres que plus régulière des chaînes:(c'est parce que
\
et$
peuvent être utilisés comme des références arrières de la capture de regex groupes, donc si vous voulez utilisés au pied de la lettre, vous avez besoin de leur échapper).En d'autres termes, le premier et le 2e params de
replace
etreplaceAll
se comportent différemment. Pourreplace
vous avez besoin de doubler la\
dans les deux params (standard s'échapper d'une barre oblique inverse dans une chaîne littérale), alors que dansreplaceAll
, vous devez quadruple! (norme de la chaîne de l'évasion + spécifiques de la fonction échapper)Pour résumer, pour de simples remplacements, on devrait s'en tenir à
replace("\\\\", "\\")
(il suffit d'avoir un échapper, pas deux).https://ideone.com/ANeMpw
https://www.ideone.com/Fj4RCO
OriginalL'auteur jakub.g
C'est pour le remplacement de la double barre oblique inverse à une seule barre oblique inverse
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
OriginalL'auteur Naveen Kumar Yadav
"\\u003c"
ne semble pas appartenir à l'UTF-8 charset'. Il est cinq les caractères UTF-8: '\
', '0', '0', '3', et 'c'. La vraie question est de savoir pourquoi les doubles barres obliques inverses il à tous? Ou, sont ils vraiment là? et est votre problème peut-être quelque chose de complètement différent? Si la Chaîne"\\u003c"
est dans votre code source, il n'y a pas de double barres obliques inverses à tous au moment de l'exécution, et quel que soit votre problème, peut-être, elle ne concerne pas le décodage de la présence de la double anti-slash.OriginalL'auteur user207421
Essayez d'utiliser,
OriginalL'auteur Jaykishan