2009-09-03 5 views
12

J'essaie de remplacer le caractère de barre oblique inverse (échappement) dans un littéral de chaîne Javascript.Javascript - Remplacer le caractère d'échappement dans un littéral de chaîne

J'ai besoin de le remplacer par une double barre oblique pour que je puisse alors faire une redirection:

var newpath = 'file:///C:\funstuff\buildtools\viewer.html'.replace(/\\/g,"\\"); 
window.location = newpath; 

Cependant, il semble avoir aucun résultat.

Je n'ai pas la possibilité d'échapper correctement les barres obliques inverses avant qu'elles ne soient traitées par Javascript.

Comment puis-je remplacer (\) par (\\) pour que Javascript soit heureux?

Merci, Derek

+0

Si vous stockez la barre oblique inverse en HTML, vous pouvez utiliser '.replace (/ \\/g, "\\\\")' avec elle. Par exemple, s'il existe une barre oblique inverse dans le document HTML, vous pouvez alors utiliser 'document.body.innerHTML.replace (/ \\/g," \\\\ ");', qui remplacera toutes les barres obliques inversées par une double barre oblique inverse. – Viliami

Répondre

21

Si c'est un littéral, vous devez les backslashs avant Javascript les voit; il n'y a pas moyen de contourner cela.

var newpath = 'file:///C:\\funstuff\\buildtools\\viewer.html'; 
window.location = newpath; 

Si newpath est d'obtenir sa valeur d'ailleurs, et vraiment contenir antislashs, vous n'avez pas besoin de les doubler; mais si vous vouliez vraiment pour une raison quelconque, ne pas oublier de les backslashs dans le remplacer() appel:

newpath.replace(/\\/g,"\\\\"); 

Pourquoi avez-vous pas la possibilité d'échapper correctement les antislashs avant qu'elles ne soient traitées par Javascript ? Si le problème est que votre source Javascript est générée à partir d'un autre langage de script qui utilise lui-même \ comme un caractère d'échappement, il suffit d'ajouter un niveau d'échapper:

var newpath = 'file:///C:\\\\funstuff\\\\buildtools\\\\viewer.html'; 
+0

Grande réponse ombre de lune. Je ne peux pas changer le chemin avant que Javascript ne le voit, car il est interpolé dans le Javascript par une tâche de copie et de filtrage ANT. Je vais devoir faire une demande de changement pour la tâche ANT. Pouvez-vous expliquer pourquoi il est impossible de remplacer le caractère d'échappement dans un littéral de chaîne, mais cela est possible dans un objet chaîne? J'ai lu cela, mais je ne vois toujours pas pourquoi cette différence existe: The Complete Javascript Strings Reference dbasch

+0

J'ai lu cela, mais je ne vois toujours pas pourquoi cette différence existe: http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference Désolé, je suis un Stack Overflow n00b;) – dbasch

+0

@dbasch: Votre exemple de code ne peut pas remplacer les caractères '\' car les caractères n'existent plus dans la chaîne au moment où replace() s'exécute. Ce sont des caractères d'échappement: des caractères qui contrôlent l'analyse de la chaîne littérale et sont consommés dans le processus. – moonshadow

2

Vous devriez être remplacer par « \\\\ » car "\\" s'échappe en un seul \ donc pas de changement.

+0

J'ai essayé ceci et il n'a pas fait le remplacement. – dbasch

0

Pour mieux démontrer et comprendre le comportement échapper chaîne , prenez l'exemple suivant:

Vous pouvez voir ce que la chaîne ressemble à la mémoire après avoir été analysé par le JS-moteur en divisant la chaîne, ainsi offrant également des solutions potentielles (laids) autour de cette question:

'file:///C:\funstuff\buildtools\viewer.html'.split('') 
//> 
["f", "i", "l", "e", ":", "/", "/", "/", "C", ":", "", "u", "n", "s", "t", "u", 
    "f", "f", "", "u", "i", "l", "d", "t", "o", "o", "l", "s", "", "i", "e", "w", 
    "e", "r", ".", "h", "t", "m", "l"] 

'file:///C:\funstuff\buildtools\viewer.html'.split('').map(function(e){ 
    return e.charCodeAt() 
}); 
//> 
[102, 105, 108, 101, 58, 47, 47, 47, 67, 58, 12, 117, 110, 115, 116, 117, 102, 
102, 8, 117, 105, 108, 100, 116, 111, 111, 108, 115, 11, 105, 101, 119, 101, 
114, 46, 104, 116, 109, 108] 
//>in Hex values by applying .toString(16) 
["66", "69", "6c", "65", "3a", "2f", "2f", "2f", "43", "3a", "c", "75", "6e", 
"73", "74", "75", "66", "66", "8", "75", "69", "6c", "64", "74", "6f", "6f", 
"6c", "73", "b", "69", "65", "77", "65", "72", "2e", "68", "74", "6d", "6c"] 

Fondamentalement, le seul anti-slash échappe le caractère suivant, donnant ainsi lieu à des résultats inattendus, si le contexte d'échappements n'est pas respectée.

Solution:

Grâce à une consultation table, vous pouvez restaurer de nombreux personnages se sont échappés errantly si elles se trouvent en dehors de la plage imprimable de caractères ASCII de \x20-\x7F. Pour l'exemple ci-dessus par exemple, 12 ou \x0c [12..toString(16)] deviendrait '\\'+'v', et ainsi de suite.

PS: Soyez conscient qu'une perte d'information est produite, et que vous essayez de restaurer des informations par l'information contextual- ou méta-, ce qui signifie dans votre cas que la chaîne est dans la plage ASCII imprimable.

Veuillez partager toute implémentation avec la communauté. À votre santé!

-1

< < échapper les caractères de remplacement >>

import java.util.Scanner; 

public class Example7 { 

    public static void main(String[] args) { 
    Scanner in=new Scanner(System.in); 
    System.out.println("Please enter a sentence: "); 
    String a=in.nextLine(); 
    //System.out.println("the word had enter: "+a); 

    String Str1 = a.replace("\\n", "(new_line)"); 
    //System.out.println(Str1); 
    String Str2 = Str1.replace("\\t", "(tab)"); 
    //System.out.println(Str2); 
    String Str3 = Str2.replace("\\t", "(tab)"); 
    String Str4 = Str3.replace("\\\\", "(comment_line)"); 
    String Str5 = Str4.replace(":)", "(smile) "); 
    System.out.println("The new sentence:" +Str5); 
    } 
} 
Questions connexes