web-dev-qa-db-fra.com

Barre oblique dans Java Regex

Je n'arrive pas à comprendre pourquoi le code suivant ne se comporte pas comme prévu

"Hello/You/There".replaceAll("/", "\\/");
  • Résultat attendu: Hello\/You\/There
  • Sortie réelle: Hello/You/There

Dois-je échapper aux barres obliques? Je ne le pensais pas mais j'ai aussi essayé ce qui suit contre ma volonté ... n'a pas fonctionné

"Hello/You/There".replaceAll("\\/", "\\/");

Finalement, j'ai réalisé que je n'avais pas besoin d'expression régulière et que je pouvais simplement utiliser ce qui suit, ce qui ne crée pas d'expression régulière

"Hello/You/There".replace("/", "\\/");

Cependant, j'aimerais quand même comprendre pourquoi mon premier exemple ne fonctionne pas.

47
Juan Mendes

En réalité, le problème est que vous devez échapper deux fois barres obliques inverses dans la chaîne de remplacement. Vous voyez, "\\/" (comme vous le savez sûrement) signifie que la chaîne de remplacement est \/ et (comme vous ne le savez probablement pas), la chaîne de remplacement \/ insère simplement /, car Java est étrange et donne à \ une signification spéciale. dans la chaîne de remplacement. (C'est soi-disant que \$ sera un signe dollar littéral, mais je pense que la vraie raison est qu'ils voulaient gâcher les gens. Les autres langues ne le font pas de cette façon.) Vous devez donc écrire non plus:

"Hello/You/There".replaceAll("/", "\\\\/");

ou:

"Hello/You/There".replaceAll("/", Matcher.quoteReplacement("\\/"));

(Utilisation de Java.util.regex.Matcher.quoteReplacement(String) .)

73
ruakh

Une double évasion est requise lorsqu'elle est présentée sous forme de chaîne. 

Chaque fois que je fais une nouvelle expression régulière, je fais une série de tests avec des outils en ligne, par exemple: http://www.regexplanet.com/advanced/Java/index.html

Ce site Web vous permet de saisir l’expression rationnelle, qu’elle échappera dans une chaîne, puis de la tester avec différentes entrées.

1
James Oravec

Il y a en fait une raison derrière tout cela qui est foiré. Un peu plus de profondeur est fait dans ce fil et pourrait être utile pour comprendre la raison pour laquelle "\\" se comporte comme ceci.

0
coder91