web-dev-qa-db-fra.com

Java: remplacez tout 'dans une chaîne par \'

J'ai besoin d'échapper à toutes les guillemets (') dans une chaîne, donc ça devient \'

J'ai essayé d'utiliser replaceAll, mais cela ne fait rien. Pour une raison quelconque, je n'arrive pas à faire fonctionner l'expression régulière.

J'essaye avec

String s = "You'll be totally awesome, I'm really terrible";
String shouldBecome = "You\'ll be totally awesome, I\'m really terrible";
s = s.replaceAll("'","\\'"); // Doesn't do anything
s = s.replaceAll("\'","\\'"); // Doesn't do anything
s = s.replaceAll("\\'","\\'"); // Doesn't do anything

Je suis vraiment coincé ici, j'espère que quelqu'un pourra m'aider ici.

Merci,

J'ai gagné

21
Iwan Eising

Vous devez d'abord échapper à la barre oblique inverse car c'est un littéral (donnant \\), puis l'échapper à nouveau à cause de l'expression régulière (donnant \\\\). Alors, essayez:

 s.replaceAll("'", "\\\\'");

sortie:

You\'ll be totally awesome, I\'m really terrible
31
Sage

Utilisez replace ()

 s = s.replace("'", "\\'"); 

production:

Tu seras totalement génial, je suis vraiment terrible

12
kosa

Prenons un tour de String # repalceAll (String regex, String remplacement)

Vous verrez que:

Une invocation de cette méthode de la forme str.replaceAll (regex, repl) donne exactement le même résultat que l'expression

Pattern.compile(regex).matcher(str).replaceAll(repl)

Jetons donc un coup d'oeil à la documentation Matcher.html # replaceAll (Java.lang.String)

Notez que les barres obliques inverses (\) et les signes dollar ($) dans la chaîne de remplacement peut entraîner des résultats différents que s'il était traité comme une chaîne de remplacement littérale. Les signes dollar peuvent être traités comme des références aux sous-séquences capturées comme décrit ci-dessus, et les barres obliques inverses sont utilisées pour échapper les caractères littéraux dans la chaîne de remplacement .

Vous pouvez voir que dans replacement nous avons un caractère spécial $ qui peut être utilisé comme référence pour un groupe capturé comme

System.out.println("aHellob,aWorldb".replaceAll("a(\\w+?)b", "$1"));
// result Hello,World

Mais parfois, nous ne voulons pas $ être si spécial parce que nous voulons l'utiliser comme simple caractère dollar, nous avons donc besoin d'un moyen de lui échapper.
Et voici \, car puisqu'il est utilisé pour échapper aux métacaractères dans les expressions rationnelles, les chaînes et probablement dans d'autres endroits, il est préférable de l'utiliser ici pour échapper $.

Alors maintenant \ est aussi un métacaractère pour remplacer une partie, donc si vous voulez faire simple \ littéral en remplacement, vous devez y échapper en quelque sorte. Et devine quoi? Vous y échappez de la même manière que vous y échappez en regex ou String. Il vous suffit de placer un autre \ avant celui que vous échappez.

Donc, si vous voulez créer \ en pièce de rechange vous devez ajouter un autre \ avant cela. Mais rappelez-vous que pour écrire \ littéral dans String, vous devez l'écrire comme "\\" pour créer deux \\ en remplacement, vous devez l'écrire comme "\\\\".


Alors essayez

s = s.replaceAll("'", "\\\\'");

Ou encore mieux

pour réduire l'échappement explicite dans la partie de remplacement (et aussi dans la partie regex - j'ai oublié de le mentionner plus tôt) utilisez simplement replace à la place replaceAll qui ajoute l'échappement regex pour nous

s = s.replace("'", "\\'");
9
Pshemo

Cela ne dit pas comment "résoudre" le problème - cela a déjà été fait dans d'autres réponses; il existe pour extraire les détails et les références de documentation applicables.


Lors de l'utilisation de String.replaceAll ou l'un des remplaçants Matcher applicables, faites attention à la chaîne de remplacement et à la façon dont elle est gérée:

Notez que les barres obliques inverses (\) et les signes dollar ($) dans la chaîne de remplacement peut entraîner des résultats différents de ceux qui étaient traités comme une chaîne de remplacement littérale. Les signes dollar peuvent être traités comme des références aux sous-séquences capturées comme décrit ci-dessus, et les barres obliques inverses sont utilisées pour échapper les caractères littéraux dans la chaîne de remplacement.

Comme l'a souligné isnot2bad dans un commentaire, Matcher.quoteReplacement peut être utile ici:

Renvoie une chaîne de remplacement littérale pour la chaîne spécifiée. .. La chaîne produite correspondra à la séquence de caractères en s traitée comme une séquence littérale. Barres obliques (\) et les signes dollar ($) n'aura pas de signification particulière.

3
user2864740

Vous pouvez également essayer d'utiliser quelque chose comme StringEscapeUtils pour vous rendre la vie encore plus facile: http://commons.Apache.org/proper/commons-lang/javadocs/api-2.6/org/Apache/commons/lang/StringEscapeUtils .html

s = StringEscapeUtils.escapeJava(s);
1
LeoPleurodon