2010-11-05 7 views
2

J'ai utilisé string.replaceAll() en Java auparavant sans problème, mais je suis perplexe sur celui-ci. Je pensais que cela fonctionnerait simplement car il n'y a pas de caractères "/" ou "$". Voici ce que j'essaie de faire:Pourquoi ce code Java String.replaceAll() ne fonctionne-t-il pas?

String testString = "__constant float* windowArray"; 
String result = testString.replaceAll("__constant float* windowArray", "__global float* windowArray"); 

Le résultat de la variable finit par ressembler à testString. Je ne comprends pas pourquoi il n'y a pas de changement, s'il vous plaît aider.

+0

Wow. Plus j'en apprends sur Java plus j'aime C#. – Crispy

+0

duplication possible de [Backslash problem with String.replaceAll] (http://stackoverflow.com/questions/1701839/backslash-problem-with-string-replaceall) – McDowell

Répondre

7

Le premier argument passé à replaceAll est toujours traitée comme une expression régulière. Le caractère * est un caractère spécial signifiant, à peu près, la chose précédente dans la chaîne (ici: t), peut être là 0 fois ou plus. Ce que vous voulez faire est d'échapper le * pour l'expression régulière. Votre premier argument devrait ressembler davantage:

"__constant float\\* windowArray" 

Le second argument est, au moins pour vos besoins, toujours juste une chaîne normale, de sorte que vous n'avez pas besoin d'échapper à la * là.

String result = testString.replaceAll("__constant float\\* windowArray", "__global float* windowArray"); 
2

Vous aurez besoin d'échapper le * car c'est un caractère spécial dans les expressions régulières.

Alors testString.replaceAll("__constant float\\* windowArray", "__global float\\* windowArray");

+0

Ou, si l'échappement manuel n'est pas réalisable (par exemple lors de la construction d'un motif à l'exécution), utilisez 'Pattern.quote (String)' et 'Matcher.quoteReplacement (String)'. – Barend

0
String result = testString.replaceAll("__constant float windowArray\\\\*", "__global float\\* windowArray"); 
2

Le * est un quantificateur regex. La méthode replaceAll utilise regex. Pour éviter d'utiliser des expressions régulières, essayez d'utiliser la méthode à la place de.

Exemple:

String testString = "__constant float* windowArray"; 
String replaceString = "__global float* windowArray"; 
String result = testString.replace(testString.subSequence(0, testString.length()-1), 
      replaceString.subSequence(0, replaceString.length()-1)); 
Questions connexes