2010-11-11 28 views
0

Je dois échapper des citations d'une chaîne avant de les imprimer.Fonction de citation d'échappement dans Java ne fonctionne pas

J'ai écrit une fonction en utilisant des tableaux char pour être aussi explicite que possible. Mais cette fonction semble faire est d'imprimer sa propre entrée:

public static String escapeQuotes(String myString) { 
char[] quote=new char[]{'"'}; 
char[] escapedQuote=new char[]{'\\' , '"'}; 
return myString.replaceAll(new String(quote), new String(escapedQuote)); 
} 

public static void main(String[] args) throws Exception { 
System.out.println("asd\""); 
System.out.println(escapeQuotes("asd\"")); 
} 

J'attends la sortie de ce être: asd « asd \ »

Cependant ce que je reçois est: asd " asd"

Des idées pour faire cela correctement?

Merci

+0

remplacer fonctionnera – AHungerArtist

+0

double possible de [problème Backslash avec String.replaceAll] (http://stackoverflow.com/questions/1701839/backslash-problem-avec-string-replaceall) – McDowell

Répondre

2

Je voudrais essayer replace au lieu de replaceAll. La deuxième version est conçue pour regex, AFAIK.

modifier
De ReplaceAll docs
Notez que antislashs (\) et des signes dollar ($) dans la chaîne de remplacement peuvent entraîner que les résultats soient différents que si elle était traitée comme une chaîne de remplacement littérale
Ainsi, la barre oblique inversée dans le second argument est un problème.

Le lien direct vers le docs
http://download.oracle.com/javase/6/docs/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String)

+0

J'étais sur le point de publier cela, mais j'ai vu ceci: replace() "Renvoie une nouvelle chaîne résultant du remplacement de toutes les occurrences de oldChar dans cette chaîne par newChar." Donc la seule différence entre replace et replaceAll est qu'on utilise reg ex? Que diable? – Jere

+0

@Je pense que le signe dollar et la barre oblique inverse dans la chaîne de résultats sont utilisés pour désigner les 'variables regex'.J'ai mis à jour la réponse avec une citation des docs. –

1

Vous devez également échapper \ dans \\ Sinon tout \ dans votre chaîne d'origine restera \ et l'analyseur, pensant qu'une spéciale caractère (par exemple ") doit suivre un \ se confondre.

Chaque caractère \ ou " que vous avez placé dans une chaîne littérale Java doit être précédé de \.

Vous souhaitez utiliser replace et non replaceAll car le premier traite les chaînes, le second les expressions rationnelles. Les regexps seront plus lents dans votre cas et nécessiteront encore plus de barres obliques inverses.

replace qui fonctionne avec CharSequence s c'est-à-dire String s existe dans ce cas à partir de Java 1.5.

myString = myString.replace("\\", "\\\\"); 
myString = myString.replace("\"", "\\\""); 
1

Java est livré avec des méthodes facilement disponibles pour échapper regexs et remplacements:

public static String escapeQuotes(String myString) { 
    return myString.replaceAll(Pattern.quote("\""), Matcher.quoteReplacement("\\\"")); 
}