2010-12-16 166 views
4

le symbole newline \ n me cause un peu de mal quand je tente de détecter et de le remplacer: Cela fonctionne bien:Java replaceAll avec retour à la ligne

String x = "Bob was a bob \\n"; 
String y = x.replaceAll("was", "bob"); 
System.out.println(y); 

bout ce code ne donne pas le résultat souhaité

String x = "Bob was a bob \\n"; 
String y = x.replaceAll("\n", "bob"); 
System.out.println(y); 

Répondre

8

"Bob was a bob \\n" devient littéralement Bob was a bob \n

Il n'y a pas de nouvelle ligne pour remplacer dans la chaîne d'entrée. Essayez-vous de remplacer un caractère de nouvelle ligne ou la séquence d'échappement \\n?

+0

J'essaye de remplacer la nouvelle ligne par une autre chaîne par exemple "A B \ n C" deviendrait "A B Y C" – Kay

+3

Comme je l'ai dit, il n'y a AUCUN caractère de nouvelle ligne dans votre chaîne d'entrée. –

+4

Votre chaîne d'entrée n'a pas de retour à la ligne. Il a un backslash suivi d'une lettre n. Pendant ce temps, votre regex n'a pas de séquence d'échappement pour un retour à la ligne. Il a une nouvelle ligne réelle. –

0

Avez-vous essayé cette ?:

x.replaceAll("\\n", "bob"); 

vous devriez échapper à la nouvelle l ine char avant de l'utiliser dans la fonction de remplacement.

+0

Cela ne fonctionne malheureusement pas. – Kay

+0

Dans la chaîne regex, vous pouvez utiliser '\ n' ou' \\ n'. Une fois le compilateur Java terminé, le compilateur regex verra un saut de ligne réel dans le premier cas, ou la séquence d'échappement backslash-'n 'dans le second cas. De toute façon, cela correspondra à un saut de ligne. Comme d'autres l'ont fait remarquer, c'est le backslash-backslash-'n 'dans la chaîne cible qui est faux. –

0

Votre chaîne d'entrée ne contient pas de nouvelle ligne. Au lieu de cela, il contient "\ n". Voir la chaîne d'entrée corrigée ci-dessous.

String x = "Bob was a bob \n"; 
String y = x.replaceAll("\n", "bob"); 
System.out.println(y); 
3

Cela fonctionne comme prévu.

String str = "A B \n C"; 
String newStr = str.replaceAll("\\n","Y"); 
System.out.println(newStr); 

Prints: -

A B Y C 
-3

MISE À JOUR:

Je l'ai modifié pour travailler avec plusieurs ocurrences de \ n. Notez que cela peut ne pas être très efficace.

public static String replaceBob(String str,int index){ 
    char arr[] = str.toCharArray(); 
    for(int i=index; i<arr.length; i++){ 
     if(arr[i]=='\\' && i<arr.length && arr[i+1]=='n'){ 
      String temp = str.substring(0, i)+"bob"; 
      String temp2 = str.substring(i+2,str.length()); 
      str = temp + temp2; 
      str = replaceBob(str,i+2); 
      break; 
     } 
    } 
    return str; 
} 

J'ai essayé avec cela et cela a fonctionné

String x = "Bob was a bob \\n 123 \\n aaa \\n"; 
System.out.println("result:"+replaceBob(x, 0)); 

La première fois que vous appelez la fonction utiliser un index de 0.

+0

Pourquoi la downvote? – Enrique

+3

Choisissez une raison: 1.) c'est beaucoup plus compliqué que nécessaire; 2.) c'est horriblement inefficace; 3.) c'est gratuitement récursif; 4.) il y a une erreur "off-by-one" dans la condition "if"; 5.) suivi d'une erreur «off-by-two» dans le bloc «if»; 6.) il utilise la concaténation de chaîne au lieu d'un StringBuilder; ou 7.) cela ne résout pas le problème de l'OP, c'est-à-dire qu'il essaie de remplacer les nouvelles lignes dans une chaîne qui n'en contient aucune. –

1
String x = "Bob was a bob \\n"; 
String y = x.replaceAll("was", "bob"); 
System.out.println(y); 

un problème ici: "\ n" est pas de symbole de nouvelle ligne. Il devrait être:

String x = "Bob was a bob \n";// \n is newline symbol, on window newline is \r\n