2011-04-14 2 views
4

Je me demande pourquoi je ne suis pas le résultat attendu avec celui-ci:nouvelle ligne java remplacement

String t = "1302248663033 <script language='javascript'>nvieor\ngnroeignrieogi</script>"; 
t.replaceAll("\n", ""); 
System.out.println(t); 

La sortie est:

1302248663033 <script language='javascript'>nvieor 
gnroeignrieogi</script> 

Je me demande donc pourquoi \n est encore Là. Quelqu'un sait? Est-ce spécial dans un sens?

EDIT:

donc j'avais du mal avec le caractère correspondant à une nouvelle ligne. dans une expression regex, sans se rendre compte que l'on utiliser pour utiliser l'option DOTALL, donc je vais ajouter ce que l'on doit faire ici pour référence future:

String text = null; 
text = FileUtils.readFileToString(inFile); 
Pattern p = Pattern.compile("<script language='javascript'>.+?</script>\n", Pattern.DOTALL); 
text = p.matcher(text).replaceAll(""); 
out.write(text); 

Répondre

17

Les chaînes sont immuables. Les opérations de chaîne comme replaceAll ne modifient pas l'instance avec laquelle vous l'appelez, elles renvoient de nouvelles instances de chaîne. La solution consiste à affecter la chaîne modifiée à votre variable d'origine.

t = t.replaceAll("\n", ""); 
+2

C'était tout. Et je le savais. La journée a été longue ... – delmet

+3

Pour être portable entre les systèmes d'exploitation, utilisez 'System.getProperty (" line.separator ")' à la place du caractère de saut de ligne. – eee

0

Oui, \n est spécial. C'est une séquence d'échappement qui représente une nouvelle ligne. Vous devez lui échapper dans un littéral de chaîne afin qu'il soit réellement interprété comme vous le souhaitez. Annexer un \ avant la séquence afin qu'il ressemble à ceci:

"\\n" 

Maintenant, votre programme devrait ressembler à ceci:

String t = "1302248663033 <script language='javascript'>nvieor\\ngnroeignrieogi</script>"; 
t = t.replaceAll("\\n", ""); 
System.out.println(t); 

Bien sûr, si la chaîne t vient de quelque part plutôt que réellement typé par vous dans le programme, alors vous devez seulement ajouter la barre oblique supplémentaire dans votre appel à replaceAll()

Édité selon les commentaires.

+0

J'ai raté l'autre erreur que tout le monde a signalé. Vous devez prendre le résultat de l'appel 'replaceAll()' et l'utiliser, pas la chaîne d'origine. – chandsie

Questions connexes