2009-09-03 35 views
12

Estoy tratando de reemplazar el carácter de barra diagonal inversa (escape) en un literal de cadena de Javascript.Javascript - Reemplazar el carácter de escape en una cadena literal

tengo que sustituirla por una doble barra invertida para que luego pueda hacer una redirección:

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

Sin embargo, parece no tener ningún resultado.

No tengo la opción de escapar correctamente las barras diagonales inversas antes de que sean manejadas por Javascript.

¿Cómo puedo reemplazar (\) con (\\) para que Javascript esté contento?

Gracias, Derek

+0

Si almacena la barra invertida en HTML que puede usar '.replace (/ \\/g, "\\\\");' con él. Por ejemplo, si hay una barra invertida en el documento HTML, puede ir a 'document.body.innerHTML.replace (/ \\/g," \\\\ ");', que reemplazará todas las barras invertidas con una doble barra inclinada invertida. – Viliami

Respuesta

21

Si se trata de un literal, lo que necesita para escapar de las barras invertidas antes Javascript los ve; no hay forma de evitar eso.

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

Si newpath es conseguir su valor de algún otro lugar, y realmente no contener una barra invertidas, que no es necesario doblar hacia arriba; pero si de verdad quería por alguna razón, no se olvide de escapar de las barras invertidas en la llamada replace():

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

¿Por qué no tiene la opción de escapar correctamente las barras invertidas antes de que sean manejados por el Javascript ? Si el problema es que se está generando su fuente de Javascript de algún otro lenguaje de script que a su vez utiliza \ como carácter de escape, sólo tiene que añadir un nivel de escapar:

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

Gran sombra de lunación de respuesta. No puedo cambiar la ruta antes de que Javascript lo vea, ya que se interpola en el Javascript mediante una tarea ANT de copia y filtro. Voy a tener que poner una solicitud de cambio para la tarea ANT. ¿Puede explicar por qué es imposible reemplazar el carácter de escape en un literal de cadena pero es posible en un objeto de cadena? He leído a través de este, pero todavía no veo por qué existe esta diferencia: The Complete Javascript Strings Reference dbasch

+0

He leído a través de este, pero todavía no veo por qué existe esta diferencia: http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference Lo siento, soy un Stack Overflow n00b;) – dbasch

+0

@dbasch: Su código de ejemplo no puede reemplazar los caracteres '\' porque los caracteres ya no existen en la cadena cuando se ejecuta replace(). Son caracteres de escape: caracteres que controlan el análisis sintáctico de la cadena literal y se consumen en el proceso. – moonshadow

2

Usted debe reemplazar con "\\\\" porque "\\" se está escapando a un único \ por lo tanto no hay cambio.

+0

Intenté esto y no hizo el reemplazo. – dbasch

0

Para demostrar y comprender mejor la cadena de escape comportamiento, tomar el siguiente ejemplo:

se puede ver lo que la cadena se ve como en la memoria después de haber sido analizado por el JS-motor mediante la división de la cadena, por lo tanto también ofrece soluciones potenciales (feo) en torno a este tema:

'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"] 

Básicamente, la única barra invertida se escapa el siguiente carácter, lo que daría lugar a resultados inesperados, si el escape del contexto no es escuchada.

Solución:

A través de una consulta de tabla, puede restaurar muchos equivocadamente caracteres de escape si se encuentran fuera del rango de caracteres ASCII imprimible de \x20-\x7F. Para el ejemplo anterior, por ejemplo, 12 o \x0c [12..toString(16)] se convertiría en '\\'+'v', y así sucesivamente.

PS: Tenga en cuenta que una pérdida de información se produjo, y que está tratando de restaurar la información a través de información contextualizada o meta, es decir, en su caso, que la cadena está en el rango ASCII imprimible.

Por favor comparta cualquier implementación con la comunidad. ¡Aclamaciones!

-1

< < caracteres de escape de recambio >>

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); 
    } 
} 
Cuestiones relacionadas