JavaScript - 替换字符串字面量中的转义字符

19

我正在尝试替换Javascript字符串文字中的反斜杠(转义)字符。

我需要将它替换为双反斜杠,以便我可以进行重定向:

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

然而,似乎没有结果。

在JavaScript处理反斜杠之前,我无法正确转义反斜杠。

我该如何将 (\) 替换为 (\\),以使 JavaScript 顺利运行?

谢谢, Derek


如果您在HTML中存储反斜杠,则可以使用.replace(/\\/g,"\\\\")。例如,如果HTML文档中有反斜杠,则可以使用document.body.innerHTML.replace(/\\/g, "\\\\");,它将用双反斜杠替换所有反斜杠。 - Viliami
4个回答

24

如果这是一个文本字面量,你需要在JavaScript看到它们之前转义反斜杠;没有其他办法。

var newpath = 'file:///C:\\funstuff\\buildtools\\viewer.html';
window.location = newpath;
如果newpath的值是从其他地方获取的,并且确实包含单个反斜杠,那么您不需要将其加倍;但是如果出于某种原因您确实想这样做,请不要忘记在replace()调用中转义反斜杠:
newpath.replace(/\\/g,"\\\\");
为什么在 Javascript 处理反斜杠之前没有适当转义的选项?如果问题是您的 JavaScript 源代码是从某种其他脚本语言生成的,该语言本身使用 \ 作为转义字符,请添加一个级别的转义:
var newpath = 'file:///C:\\\\funstuff\\\\buildtools\\\\viewer.html';

moonshadow,你的回答太棒了。我无法在Javascript看到路径之前改变它,因为它是通过ANT复制和过滤任务插入到Javascript中的。 我将不得不提出ANT任务的更改请求。你能解释一下为什么无法替换字符串字面量中的转义字符,但在字符串对象中可以吗?我已经阅读了这篇文章,但我仍然不明白为什么存在这种差异: <a href="http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference">The Complete Javascript Strings Reference</a> - dbasch
我已经阅读了这篇文章,但仍然不明白为什么存在这种差异:http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference抱歉,我是 Stack Overflow 的新手 ;) - dbasch
@dbasch:你的示例代码无法替换 '' 字符,因为在 replace() 运行时这些字符已经不存在于字符串中了。它们是转义字符:用于控制字符串字面量解析的字符,在此过程中被消耗掉了。 - moonshadow

4
你应该使用 "\\\\" 进行替换,因为 "\\" 会转义成单个 \,因此不会有任何变化。

3
为了更好地演示和理解“字符串转义行为”,可以看下面的例子:
通过拆分字符串,您可以看到JS引擎解析后的内存中字符串的样子,从而提供解决此问题的潜在(丑陋)方案。
'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"]

基本上,单个反斜杠可以转义后面的字符,如果不注意转义上下文,则会导致意想不到的结果。

解决方案:

通过查找表,您可以恢复许多错误转义的字符,如果它们在可打印ASCII字符范围之外\x20-\x7F。例如,对于上面的例子,12\x0c [12..toString(16)] 将变成 '\\'+'v',以此类推。

附:请注意发生了信息丢失,并且您正在尝试通过上下文或元信息来恢复信息,在这种情况下,字符串在可打印的ASCII范围内。

请与社区分享任何实现。谢谢!


-7

<< 转义字符替换 >>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接